Share via


非公用的無參數函式不會用於還原序列化

為了在所有支援的目標 Framework Moniker (TFM) 之間保持一致性,預設不會再使用非公用無參數建構函式來透過 JsonSerializer 進行還原序列化。

變更描述

支援 .NET Standard 2.0 和更新版本 (也就是 4.6.0-4.7.2 版) 的獨立 System.Text.Json NuGet 套件行為,與 .NET Core 3.0 和 3.1 的內建行為不一致。 在 .NET Core 3.x 上,內部和私人建構函式可用於還原序列化。 在獨立套件中,不允許使用非公用建構函式,且如果定義了任何非公用無參數建構函式,便會擲回 MissingMethodException

從 .NET 5 和 System.Text.Json NuGet 套件 5.0.0 開始,NuGet 套件與內建 API 之間的行為一致。 序列化程式預設上會忽略非公用建構函式,包括無參數建構函式在內。 序列化程式會使用下列其中一個建構函式進行還原序列化:

  • JsonConstructorAttribute 標註的公用建構函式。
  • 公用無參數建構函式。
  • 公用參數化建構函式 (如果是唯一存在的公用建構函式)。

在這些建構函式都無法使用的情況下,如果您嘗試還原序列化型別,則會擲回 NotSupportedException

導入的版本

5.0

變更原因

  • 為了讓專為 System.Text.Json 建置的所有目標 Framework Moniker (TFM) 之間行為強制一致 (.NET Core 3.0 和更新版本與 .NET Standard 2.0)
  • 因為 JsonSerializer 不應該呼叫型別的非公用介面區,無論是建構函式、屬性還是欄位。
  • 如果您擁有型別且可行,請將無參數建構函式設為公開。
  • 否則,請為型別實作 JsonConverter<T>,並控制還原序列化行為。 如果該案例的 C# 可存取性規則允許,您可以從 JsonConverter<T> 實作呼叫非公用建構函式。

受影響的 API