JsonSerializerOptions 複製建構函式包含 JsonSerializerContext
.NET 6 推出來源產生後,JsonSerializerOptions 複製建構函式會刻意忽略 JsonSerializerContext 狀態。 由於 JsonSerializerContext 的設計是會與 JsonSerializerOptions 執行個體之間有一對一的關聯,因此這點在當時很合理。 在 .NET 7 中,IJsonTypeInfoResolver 會取代 JsonSerializerContext 以將內容一般化,而這會讓 JsonSerializerOptions 和 JsonSerializerContext 之間不需緊密結合。 複製建構函式現包含 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.