新的 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);

先前的行為

您可以撰寫將 null 作為 JsonSerializerOptions 參數值傳遞的程式碼,而且成功編譯並執行該程式碼。

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

新的行為

若您針對 JsonSerializerOptions 參數傳遞 null,則在 .NET 6,新來源產生器方法可能會造成編譯器語意模糊。 例如,您可能會看到下列錯誤訊息:

以下方法或屬性之間的呼叫模稜兩可: '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
  • 使用具名引數。

不過您在 Lambda 運算式中無法省略選擇性參數,也無法使用具名引數。

受影響的 API

所有 System.Text.Json.JsonSerializer 方法。