迁移到 System.Text.Json (JSON)

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

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

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

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

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

  • 若要替代特定类型的默认序列化行为,可以 编写自定义转换器。

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

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

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

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

  • 属性上的 [JsonIgnore] 属性会导致在序列化期间从 JSON 中省略该属性。

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

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