You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Newtonsoft.Json反序列化继承对象数组时类型识别异常问题

解决方案

问题根源

  1. 目标类型错误:反序列化时你将目标类型指定为Point3D[],但原始数组是Point[],其中包含基类Point的实例,强制把基类对象转换为子类Point3D必然引发类型异常。
  2. 未配置类型处理:反序列化代码没有设置TypeNameHandling=Auto,导致JSON中已有的$type标识无法被Json.NET识别,无法根据类型标记正确还原对象类型。

修正后的反序列化代码

using (var fs = new FileStream(dlg.FileName, FileMode.Open, FileAccess.Read))
{
    switch (Path.GetExtension(dlg.FileName))
    {
        // ...其他分支
        case ".json":
            var jf = new JsonSerializer();
            // 与序列化时保持一致的类型处理配置
            jf.TypeNameHandling = TypeNameHandling.Auto;
            using (var r = new StreamReader(fs))
                // 目标类型改为原始数组的基类型Point[]
                points = (Point[])jf.Deserialize(r, typeof(Point[]));
            break;
    }
}

关键说明

  • 序列化时使用的是Point[]类型数组,反序列化必须对应相同的基类型数组,这样Json.NET才能根据JSON中的$type标记,自动将元素实例化为Point或Point3D。
  • TypeNameHandling=Auto必须在序列化和反序列化两端同时配置,否则JSON中的类型标记无法生效。

验证效果

修正后,JSON中的类型标识会被正确解析:

  • 标记为"$type":"PointLib.Point, PointLib"的元素会被还原为Point实例
  • 标记为"$type":"LabOneFormsApp.Point3D, LabOneFormsApp"的元素会被还原为Point3D实例

内容的提问来源于stack exchange,提问作者Rearden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 22:25:30