.NET 7中System.Text.Json多级多态序列化的[JsonDerivedType]配置位置
解决System.Text.Json多级多态序列化异常的问题
你遇到的异常是因为System.Text.Json的多态类型注册规则与DataContractSerializer不同:所有直接或间接的派生类型(包括“孙类”)必须直接在最顶层的基类上通过[JsonDerivedType]声明,而不能像[KnownType]那样分散在中间派生类上。
修正后的类型配置代码
// 所有派生类型(包括孙类)都直接注册在顶层基类上 [JsonDerivedType(typeof(DerivedType), "DerivedType:#MyNamespace")] [JsonDerivedType(typeof(DerivedOfDerivedType), "DerivedOfDerivedType:#MyNamespace")] public abstract class BaseType { } // Properties omitted public class DerivedType : BaseType { public string DerivedValue { get; set; } } public class DerivedOfDerivedType : DerivedType { public string DerivedOfDerivedValue { get; set; } }
原因说明
当序列化List<BaseType>时,System.Text.Json只会读取BaseType上的多态配置,中间类DerivedType上的[JsonDerivedType]不会被纳入基类的多态解析逻辑。因此必须把所有最终需要序列化的派生类型(包括深层的DerivedOfDerivedType)直接注册在顶层基类上,这样序列化器才能识别这些类型并正确处理。
验证结果
修正后执行你的序列化代码,会生成包含类型标识的JSON:
[ { "$type": "DerivedOfDerivedType:#MyNamespace", "DerivedValue": "value 1", "DerivedOfDerivedValue": "value of DerivedOfDerived" } ]
额外说明
如果不想在基类上集中注册所有派生类型,也可以通过JsonSerializerOptions的TypeInfoResolver手动配置多态规则,但属性方式下必须遵循“顶层基类注册所有派生类型”的规则。
内容的提问来源于stack exchange,提问作者dbc
相关产品推荐
相关产品推荐

