Newtonsoft.Json反序列化继承对象数组时类型识别异常问题
解决方案
问题根源
- 目标类型错误:反序列化时你将目标类型指定为
Point3D[],但原始数组是Point[],其中包含基类Point的实例,强制把基类对象转换为子类Point3D必然引发类型异常。 - 未配置类型处理:反序列化代码没有设置
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
相关产品推荐
相关产品推荐

