共用方式為


JsonSerializerOptions 的複製建構函式包含 JsonSerializerContext

隨著 .NET 6 推出來源生成功能,複製建構函式被刻意設計為忽略其 JsonSerializerOptions 狀態。 這當時是有道理的,因為 JsonSerializerContext 被設計為與 JsonSerializerOptions 實例有 1:1 的關係。 在 .NET 7 中,IJsonTypeInfoResolver 將取代 JsonSerializerContext 以一般化內容,從而消除 JsonSerializerOptionsJsonSerializerContext 之間的緊密結合需求。 複製建構函式現在包含 IJsonTypeInfoResolver/JsonSerializerContext 資訊,可能會在某些情境中顯示為結構性改變。

先前的行為

在 .NET 6 中,下列程式代碼已成功串行化。 複製 MyContext 建構函式會捨棄組態(不支援 Poco2),而且串行化會成功,因為新的選項實例預設為使用以反映為基礎的串行化。

var options = new JsonSerializerOptions(MyContext.Default.Options);
JsonSerializer.Serialize(new Poco2(), options);

[JsonSerializable(typeof(Poco1))]
public partial class MyContext : JsonSerializerContext {}

public class Poco1 {}
public class Poco2 {}

新行為

從 .NET 7 開始,與過去行為區段所示相同的程式碼會擲回InvalidOperationException例外。 這是因為複製建構函式現在納入了元數據 MyContext,而該元數據不支援 Poco2 合約。

推出的版本

.NET 7

破壞性變更的類型

這項變更可能會影響 二進位相容性

變更的原因

JsonSerializerContext 是複製建構函式忽略的唯一設定。 對於某些用戶來說,這種行為令人吃驚。

如果您依賴 .NET 6 的特性,您可以手動取消設定 TypeInfoResolver 屬性,以恢復反射為基礎的合約解析:

var options = new JsonSerializerOptions(MyContext.Default.Options);
options.TypeInfoResolver = null; // Unset `MyContext.Default` as the resolver for the options instance.

受影響的 API