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 メソッド。
.NET