非公共的无参数构造函数不用于反序列化

为了在所有支持的目标框架名称(TFM)中保持一致性,默认情况下,非公共无参数构造函数不再与 JsonSerializer 一起用于反序列化。

更改描述

支持 .NET Standard 2.0 及更高版本的独立 System.Text.Json NuGet 包 (即版本 4.6.0-4.7.2)的行为与 .NET Core 3.0 和 3.1 上的内置行为不一致。 在 .NET Core 3.x 上,内部构造函数和专用构造函数可用于反序列化。 在独立包中,不允许非公共构造函数,如果未定义公共无参数构造函数,则会引发 a MissingMethodException

从 .NET 5 和 System.Text.Json NuGet 包 5.0.0 开始,NuGet 包和内置 API 之间的行为是一致的。 默认情况下,序列化程序将忽略非公共构造函数(包括无参数构造函数)。 序列化程序使用以下构造函数之一进行反序列化:

  • JsonConstructorAttribute注释的公共构造函数。
  • 公共无参数构造函数。
  • 公共参数化构造函数(如果它是唯一存在的公共构造函数)。

如果这些构造函数都不可用,则在尝试对该类型进行反序列化时,将引发 NotSupportedException

已引入的版本

5.0

更改原因

  • 为了在 System.Text.Json 针对其生成的所有目标框架名字对象 (TFM) 之间强制执行一致的行为(.NET Core 3.0 和更高版本以及 .NET Standard 2.0)
  • 因为 JsonSerializer 不应调用类型的非公共的表面区域,无论是构造函数、属性还是字段。
  • 如果拥有该类型且可行,请公开无参数构造函数。
  • 否则,针对该类型实现 JsonConverter<T>,并控制反序列化行为。 如果该方案的 C# 辅助功能规则允许它,则可以从 JsonConverter<T> 实现中调用非公共构造函数。

受影响的 API