Start Debugging
2023-09-11 更新日 2023-11-05 csharpdotnetdotnet-8 Edit on GitHub

.NET 8 JsonSerializerOptions を readonly としてマークする

.NET 8 で MakeReadOnly を使って JsonSerializerOptions のインスタンスを読み取り専用にする方法と、IsReadOnly プロパティでそれを確認する方法を解説します。

.NET 8 から、JsonSerializerOptions のインスタンスを読み取り専用としてマークし、それ以降の変更を防げるようになりました。インスタンスをフリーズするには、options インスタンスに対して MakeReadOnly を呼び出すだけです。

例を見てみましょう。

var options = new JsonSerializerOptions
{
    AllowTrailingCommas = true,
    PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseUpper,
    PreferredObjectCreationHandling = JsonObjectCreationHandling.Populate,
};

options.MakeReadOnly();

さらに、インスタンスがフリーズされているかどうかは IsReadOnly プロパティで確認できます。

options.IsReadOnly

読み取り専用としてマークしたあとに JsonSerializerOptions インスタンスを変更しようとすると、InvalidOperationException が発生します。

Unhandled exception. System.InvalidOperationException: This JsonSerializerOptions instance is read-only or has already been used in serialization or deserialization.
   at System.Text.Json.ThrowHelper.ThrowInvalidOperationException_SerializerOptionsReadOnly(JsonSerializerContext context)
   at System.Text.Json.JsonSerializerOptions.VerifyMutable()

MakeReadOnly(bool populateMissingResolver) のオーバーロード

populateMissingResolvertrue を渡すと、このメソッドは必要に応じて JsonSerializerOptions にデフォルトのリフレクションベースの resolver を追加します。trimmed / Native AOT アプリケーションでこのメソッドを使う と、リフレクション関連のアセンブリがビルドに取り込まれてしまうので注意してください。

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< 戻る