迁移到 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]
。 该构造函数可设置只读字段和属性。它支持许多集合的序列化和反序列化,但存在限制。 有关序列化和反序列化支持的类型和集合的详细信息,请参阅 支持的类型 文档。
在某些情况下,它支持对自定义泛型集合进行序列化和反序列化。
没有内置支持的其他类型包括:
DataSet
、DataTable
、DBNull
、TimeZoneInfo
、Type
、ValueTuple
。 但是,可以编写自定义转换器来支持这些类型。它支持多态类型层次结构序列化和反序列化,其中已通过
[JsonDerivedType]
属性或自定义转换器显式选择加入了类型。 不支持开放式继承层次结构,并且多态性的往返需要所有已知派生类型的类型鉴别器标识符。属性上的
[JsonIgnore]
属性会导致在序列化期间从 JSON 中省略该属性。若要在
System.Text.Json
中保留引用并处理循环引用,请将JsonSerializerOptions.ReferenceHandler
设置为ReferenceHandler.Preserve
。