C# Newtonsoft.Json 反序列化子类数据丢失问题
问题描述:
代码中对象类型是父类:
public List<EmbossingActionConfigBase> EmbossingActionConfigBaseList;
但是保存的数据是子类数据,然后序列化或者反序列化的时候要求对象类型不丢失。
解决方法:
var settings = new JsonSerializerSettings
{TypeNameHandling = TypeNameHandling.Auto
};
string json = JsonConvert.SerializeObject(list, settings);
效果:
json字符串:
"EmbossingActionConfigBaseList": {"$type": "System.Collections.Generic.List`1[[FluentVision.Control.EmbossingActionConfigBase, FluentVision.Controls]], mscorlib","$values": [{"$id": "24","$type": "FluentVision.Control.StageZActionConfig, FluentVision.Controls","Gap": 500,"Speed": 100.0,"MaxForce": 4.0,"MinForce": 1.0,"Overtime": 100,"EmbossingActionType": 0,"Delay": 100},{"$id": "25","$type": "FluentVision.Control.StageZActionConfig, FluentVision.Controls","Gap": 100,"Speed": 50.0,"MaxForce": 4.0,"MinForce": 1.0,"Overtime": 100,"EmbossingActionType": 0,"Delay": 100},{"$id": "26","$type": "FluentVision.Control.StageZActionConfig, FluentVision.Controls","Gap": 30,"Speed": 20.0,"MaxForce": 4.0,"MinForce": 1.0,"Overtime": 100,"EmbossingActionType": 0,"Delay": 100},{"$id": "27","$type": "FluentVision.Control.LevelingActionConfig, FluentVision.Controls","ToleranceError": 10.0,"BaseGap": 30,"EmbossingActionType": 1,"Delay": 100},{"$id": "28","$type": "FluentVision.Control.DetectMaskActionConfig, FluentVision.Controls","MaskAlignmentPositionDescription": "下视觉产品拍照位","EmbossingActionType": 2,"Delay": 10},{"$id": "29","$type": "FluentVision.Control.AlignmentActionConfig, FluentVision.Controls","ProductAlignmentPositionDescription": "下视觉相机压合位置产品拍照","EmbossingActionType": 3,"Delay": 10}]
}
其中type字段就是类型描述,多个子类信息分开保存,反序列化的时候即使使用基类类型承接也不会丢失信息。
参考:C# Newtonsoft.Json 反序列化派生类数据丢失问题_c# newtonsoft json 派生类型-CSDN博客