新しい 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 メソッド。