新的 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 運算式中無法省略選擇性參數,也無法使用具名引數。