首页 > 后端开发 > C++ > 如何在没有'$type”字段的情况下实现 Json.Net 中多态子对象的自定义序列化?

如何在没有'$type”字段的情况下实现 Json.Net 中多态子对象的自定义序列化?

Linda Hamilton
发布: 2025-01-24 13:12:10
原创
235 人浏览过

How Can I Achieve Custom Serialization of Polymorphic Child Objects in Json.Net Without the

Json.Net 中自定义多态子对象序列化,无需额外类型字段

问题:

使用 Json.Net 的 TypeNameHandling.Auto 设置序列化/反序列化包含多态子对象的 C# 类非常方便。但是,这种方法会在序列化后的 JSON 中引入额外的 $type 字段,增加了开销。

解决方案:

带有编码子类型属性的自定义基类:

与其在容器类中存储子类型信息,不如将其作为属性添加到基类中:

<code class="language-csharp">[JsonConverter(typeof(SubTypeClassConverter))]
public class SubTypeClassBase
{
    [JsonConverter(typeof(StringEnumConverter))]
    public SubType Type { get { return typeToSubType[GetType()]; } }
}</code>
登录后复制

此属性反映对象的运行时类型,并将其编码为枚举值。 typeToSubType 字典需要自行实现,用于将类型映射到枚举值。

自定义 JsonConverter 用于反序列化:

为基类创建一个自定义 JsonConverter

<code class="language-csharp">public class SubTypeClassConverter : JsonConverter
{
    // 读取 JSON 并确定实际类型
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var token = JToken.Load(reader);
        var typeToken = token["Type"];
        var actualType = SubTypeClassBase.GetTypeFromSubType(typeToken.ToObject<SubType>(serializer)); // 使用 GetTypeFromSubType 方法
        if (existingValue == null || existingValue.GetType() != actualType)
        {
            // 创建实际的对象实例
            var contract = serializer.ContractResolver.ResolveContract(actualType);
            existingValue = contract.DefaultCreator();
        }
        // 使用 "Populate" 方法避免无限递归
        using (var subReader = token.CreateReader())
        {
            serializer.Populate(subReader, existingValue);
        }
        return existingValue;
    }

    // ...其他方法 (WriteJson 等) ...
}</code>
登录后复制

GetTypeFromSubType 方法需要自行实现,根据枚举值返回对应的类型。

优势:

  • 子类型信息编码在类内的属性中,独立于容器。
  • 反序列化是动态处理的,允许将来修改类层次结构而不会破坏序列化。
  • 它消除了 JSON 输出中冗余的 $type 字段,减小了其大小。

注意: 代码片段中省略了 GetTypeFromSubTypetypeToSubType 的具体实现,以及 WriteJson 方法的实现,这些需要根据具体的 SubType 枚举和子类定义进行编写。 SubType 枚举应该包含所有可能的子类型。 typeToSubType 字典应该将每个子类的类型映射到对应的 SubType 枚举值。 GetTypeFromSubType 方法则应该执行反向映射。

以上是如何在没有'$type”字段的情况下实现 Json.Net 中多态子对象的自定义序列化?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板