.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) のオーバーロード
populateMissingResolver に true を渡すと、このメソッドは必要に応じて JsonSerializerOptions にデフォルトのリフレクションベースの resolver を追加します。trimmed / Native AOT アプリケーションでこのメソッドを使う と、リフレクション関連のアセンブリがビルドに取り込まれてしまうので注意してください。
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.