共用方式為


以反映為基礎的還原序列化程式會積極地解析中繼資料

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 Preview 4

中斷性變更的類型

此變更為行為變更

變更原因

這項變更是由結合來源產生的內容中快速路徑序列化支援相關的新需求所需要 (請參閱 dotnet/runtime#71933)。

如果這項變更對您有問題,您可以:

  • 從您的類型中移除不支援的屬性。

  • 為不支援的類型撰寫自訂轉換器。

  • 新增 JsonIgnoreAttribute 屬性:

    public class MyPoco
    {
        public int Value { get; set; }
    
        [JsonIgnore]
        public NestedValue Unsupported { get; set; }
    }
    

受影響的 API