C# Newtonsoft.Json 反序列化子类数据丢失问题

问题描述:

代码中对象类型是父类:

cs 复制代码
public List<EmbossingActionConfigBase> EmbossingActionConfigBaseList; 

但是保存的数据是子类数据,然后序列化或者反序列化的时候要求对象类型不丢失。

解决方法:

cs 复制代码
var settings = new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.Auto
};
string json = JsonConvert.SerializeObject(list, settings);

效果:

json字符串:

cs 复制代码
"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博客