迁移到 System.Text.Json (JSON)

System.Text.Json 库默认强调字面的确定性行为,并避免任何代表调用方的猜测或解释。 该库是为了实现安全性和性能而特意这样设计的。 虽然 System.Text.Json 具有高度可配置性,并且其功能可用于最大限度地减少序列化类型所需的更改,但重要的是要考虑在以尽可能少的更改处理现有类型与重构类型之间进行权衡,以实现惯用且安全的 serialization。

从 BinaryFormatter 迁移到 System.Text.Json 时,请务必注意以下行为和选项:

  • 默认情况下,System.Text.Json 不会序列化或反序列化字段,但可以对其进行注释以进行 serialization。 或者,可谨慎地将 JsonSerializerOptions.IncludeFields 设置为 true,以包含要序列化的类型的所有公共字段。

    JsonSerializerOptions options = new()
    {
        IncludeFields = true
    };
    
  • 默认情况下,System.Text.Json 忽略专用字段和属性。 可使用 [JsonInclude] 特性启用非公共属性访问器。 若要包括专用字段,需要一些重要的额外工作

  • System.Text.Json 不能反序列化只读字段或属性,但 [JsonConstructor] 特性可用于指示应使用指定的构造函数在反序列化时创建该类型的实例。 该构造函数可设置只读字段和属性。

  • 要替代特定类型的默认 serialization 行为,你可以编写自定义转换器

  • 它支持对许多集合进行 serialization 和反序列化,但存在限制。 有关 serialization 和反序列化支持哪些集合的详细信息,请参阅支持的集合类型文档。

  • 某些情况下,它支持对自定义泛型集合进行 serialization 和反序列化。

  • 没有内置支持的其他类型包括:DataSetDataTableDBNullTimeZoneInfoTypeValueTuple。 但是,可以编写自定义转换器来支持这些类型。

  • 支持多态类型层次结构serialization和反序列化,其中已通过 [JsonDerivedType] 属性或自定义转换器显式选择加入了类型。 不支持开放式继承层次结构,并且多态性的往返需要所有已知派生类型的类型鉴别器标识符。

  • 属性上的 [JsonIgnore] 特性会导致在 serialization 过程中从 JSON 中省略属性。

  • 若要在 System.Text.Json 中保留引用并处理循环引用,请将 JsonSerializerOptions.ReferenceHandler 设置为 ReferenceHandler.Preserve

  • 可使用自定义协定广泛自定义 Serialization,从而取消对许多场景的阻止,同时最大限度地减少对已序列化类型的更改。