新しい JsonSerializer ソース ジェネレーターのオーバーロード
System.Text.Json
ソース ジェネレーター機能に、JsonTypeInfo<T> または JsonSerializerContext を介して事前に生成された型情報を受け取る新しいオーバーロードが JsonSerializer に追加されました。 これらのオーバーロードを使用すると、JsonSerializerOptions インスタンスを受け取り、実行時のリフレクションを実行する既存のオーバーロードよりもパフォーマンスが最適化されます。 これらのパラメーター型はすべて、null
を渡すことができる参照型です。 次の例は、両方のアプローチのメソッド シグネチャ パターンを示しています。
既存のリフレクションと JsonSerializerOptions
ベースのオーバーロード:
public static string JsonSerializer.Serialize<T>(T value, JsonSerializerOptions? options = null);
public static string JsonSerializer.Serialize(object value, Type type, JsonSerializerOptions? options = null);
public static T JsonSerializer.Deserialize<T>(string json, JsonSerializerOptions? options = null);
public static T JsonSerializer.Deserialize(string json, Type type, JsonSerializerOptions? options = null);
新しいソースジェネレーターと JsonTypeInfo
/JsonSerializerContext
ベースのオーバーロード:
public static string JsonSerializer.Serialize<T>(T value, JsonTypeInfo<T> jsonTypeInfo);
public static string JsonSerializer.Serialize(object value, Type type, JsonSerializerContext jsonSerializerContext);
public static T JsonSerializer.Deserialize<T>(string json, JsonTypeInfo<T> jsonTypeInfo);
public static object JsonSerializer.Deserialize(string json, Type type, JsonSerializerContext jsonSerializerContext);
以前の動作
JsonSerializerOptions パラメーターの値として null
を渡すコードを書くと、コンパイルと実行が成功しました。
entity.Property(e => e.Value).HasConversion(v => JsonSerializer.Serialize(v,null), v => JsonSerializer.Deserialize(v, null));
新しい動作
.NET 6 の新しいソースジェネレーター メソッドでは、JsonSerializerOptions パラメーターに null
を渡すと、コンパイラにあいまいさが生じる可能性があります。 たとえば、次のエラー メッセージが表示される場合があります。
次のメソッドまたはプロパティ間で呼び出しが不適切です: 'JsonSerializer.Serialize(TValue, JsonSerializerOptions?)' と 'JsonSerializer.Serialize(TValue, JsonTypeInfo)
導入されたバージョン
.NET 6
破壊的変更の種類
この変更はソースの互換性に影響を与える可能性があります。
変更理由
パフォーマンスを最適化するために、シリアライザーに新しいオーバーロードが追加されました。 詳細については、「新しい System.Text.Json ソース ジェネレーターを試してください」を参照してください。
推奨される操作
意図したターゲットへの明示的なキャストを実行するなど、意図したオーバーロードを明確にする方法でコードを更新します。 たとえば、「以前の動作」セクションの例を以下のように変更できます。
entity.Property(e => e.Value).HasConversion(v => JsonSerializer.Serialize(v, (JsonSerializerOptions)null), v => JsonSerializer.Deserialize(v, (JsonSerializerOptions)null));
その他のワークロードの例:
- 省略可能なパラメーター
JsonSerializerOptions? options = null
の省略。 - 名前付き引数の使用。
ただし、ラムダ式で省略可能なパラメーターを省略することや、名前付き引数を使用することはできません。
影響を受ける API
すべての System.Text.Json.JsonSerializer メソッド。
.NET