非公用的無參數函式不會用於還原序列化
為了在所有支援的目標 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> 實作呼叫非公用建構函式。