次の方法で共有


新しい JsonSerializer ソース ジェネレーターのオーバーロード

System.Text.Json ソース ジェネレーター機能は、JsonSerializerまたはJsonTypeInfo<T>を介して事前に生成された型情報を受け入れるJsonSerializerContextに新しいオーバーロードを追加しました。 これらのオーバーロードは、 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);

以前の動作

null パラメーターの値としてJsonSerializerOptions渡し、正常にコンパイルして実行するコードを記述できます。

entity.Property(e => e.Value).HasConversion(v => JsonSerializer.Serialize(v,null), v => JsonSerializer.Deserialize(v, null));

新しい動作

.NET 6 の新しいソース ジェネレーター メソッドでは、null パラメーターにJsonSerializerOptionsを渡すと、コンパイラのあいまいさが生じる可能性があります。 たとえば、次のエラー メッセージが表示されることがあります。

呼び出しは、次のメソッドまたはプロパティの間であいまいです: '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 メソッド。