System.Text.Json 反映型串行化程式先前使用延遲載入方法來解析屬性元數據。 這種方法使包含不支援屬性類型的 POCO 能夠成功反序列化,前提是基礎 JSON 沒有繫結到任何不支援的屬性。 (儘管相同類型的實例無法 串行化,但事實還是如此。
從 .NET 8 開始,序列化器已變更,因此所有屬性都會在序列化和反序列化時立即解析。 這項變更是為了為結合多個解析程式新增更好的支援,這需要對串行化類型圖形進行早期分析。 這項變更的副作用是,如果您依賴先前的行為,您可能會開始看到新的運行時間反序列化錯誤。
先前的行為
下列還原串行化程序代碼在 .NET 7 中成功。
var result = JsonSerializer.Deserialize<MyPoco>("""{ "Value": 1 }"""); //, MyContext.Default.MyPoco);
Console.WriteLine(result.Value);
public class MyPoco
{
public int Value { get; set; }
public NestedValue Unsupported { get; set; }
}
public class NestedValue
{
public ReadOnlySpan<byte> Span => Array.Empty<byte>();
}
新行為
從 .NET 8 開始,執行時會拋出先前InvalidOperationException段落的同一段程式碼。
System.InvalidOperationException:類型 'NestedValue' 上屬性 'Span' 的 'System.ReadOnlySpan'1[System.Byte]' 類型對串行化或還原串行化無效,因為它是指針類型、是 ref 結構,或包含尚未由特定類型取代的泛型參數。
如果您嘗試串行化相同類型的實例,則此錯誤與即使在舊版中擲回的錯誤一致。 它也會與產生編譯時間錯誤的來源產生器一致。
推出的版本
.NET 8 預覽版 4
破壞性變更的類型
此變更為行為變更。
變更的原因
這項變更是由結合來源產生的內容中快速路徑串行化支持相關的新需求所需要(請參閱 dotnet/runtime#71933)。
建議的動作
如果這項變更對您有問題,您可以:
從您的類型中移除不支援的屬性。
為不支援的類型撰寫自定義轉換器。
JsonIgnoreAttribute新增 屬性:
public class MyPoco { public int Value { get; set; } [JsonIgnore] public NestedValue Unsupported { get; set; } }