共用方式為


JsonSerializerOptions 複製建構函式包含 JsonSerializerContext

.NET 6 推出來源產生後,JsonSerializerOptions 複製建構函式會刻意忽略 JsonSerializerContext 狀態。 由於 JsonSerializerContext 的設計是會與 JsonSerializerOptions 執行個體之間有一對一的關聯,因此這點在當時很合理。 在 .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。 原因是複製建構函式現會納入不支援 Poco2 合約的 MyContext 中繼資料。

導入的版本

.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