C# 反序列化列表<;抽象类>;使用newtonsoft.json

C# 反序列化列表<;抽象类>;使用newtonsoft.json,c#,.net,vb.net,serialization,json.net,C#,.net,Vb.net,Serialization,Json.net,我试图序列化和反序列化abstract类的列表(mustinheritforvb),很明显,其中只有派生类的实例 我用JsonProperty(ItemTypeNameHandling=TypeNameHandling.Auto)修饰了list参数,获得如下输出: 但是当我反序列化它时,我一直说他不能反序列化抽象类 公共类 { 私有ObservableCollection_节点=新ObservableCollection(); // 公共可观测集合节点{ 获取{返回此。_Nodes;} }

我试图序列化和反序列化
abstract
类的列表(
mustinherit
forvb),很明显,其中只有派生类的实例

我用
JsonProperty(ItemTypeNameHandling=TypeNameHandling.Auto)
修饰了list参数,获得如下输出:

但是当我反序列化它时,我一直说他不能反序列化抽象类

公共类
{
私有ObservableCollection_节点=新ObservableCollection();
//
公共可观测集合节点{
获取{返回此。_Nodes;}
}
公共字符串名称{get;set;}
公共int Id{get;set;}
}
公共抽象类AbstractClass
{
私有ObservableCollection_节点=新ObservableCollection();
[Newtonsoft.Json.JsonProperty(itemtypenamehandling=Newtonsoft.Json.TypeNameHandling.Auto)]
公共可观测集合节点{
获取{返回此。_Nodes;}
}
}

删除注释行它可以工作

确保在反序列化时指定TypeNameHandling,如文档所示:

// for security TypeNameHandling is required when deserializing
Stockholder newStockholder = JsonConvert.DeserializeObject<Stockholder>(jsonTypeNameAuto, new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.Auto
});

原始集合和反序列化的集合匹配。

请发布反序列化代码。另外,请发布类。我一到办公室就会更新问题。实际上是这样的,但抽象类中还有一个列表,因为它是一个树节点结构。@L.Trabacchin我发布了工作示例代码(如果您在“C#Program”模式下使用LINQPad并引用Newtonsoft.Json),如果您将其编辑为使用decorators而不是设置,我将接受您的答案
// for security TypeNameHandling is required when deserializing
Stockholder newStockholder = JsonConvert.DeserializeObject<Stockholder>(jsonTypeNameAuto, new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.Auto
});
void Main()
{
    var test = new List<Business>();
    test.Add(new Hotel { Name = "Hilton", Stars = 5 });
    test.Add(new Pool { Name = "Big Splash", Capacity = 500 });

    test.Dump();

    string json = JsonConvert.SerializeObject(test, Newtonsoft.Json.Formatting.Indented, new JsonSerializerSettings
    {
        TypeNameHandling = TypeNameHandling.All
    });

    json.Dump();

    var businesses = JsonConvert.DeserializeObject<List<Business>>(json, new JsonSerializerSettings
    {
        TypeNameHandling = TypeNameHandling.All
    });

    businesses.Dump();
}

// Define other methods and classes here
public abstract class Business
{
    public string Name { get;set; }
}
public class Hotel : Business
{
    public int Stars { get;set; }
}
public class Pool : Business
{
    public int Capacity { get;set;}
}
{
  "$type": "System.Collections.Generic.List`1[[UserQuery+Business, query_jvrdcu]], mscorlib",
  "$values": [
    {
      "$type": "UserQuery+Hotel, query_jvrdcu",
      "Stars": 5,
      "Name": "Hilton"
    },
    {
      "$type": "UserQuery+Pool, query_jvrdcu",
      "Capacity": 500,
      "Name": "Big Splash"
    }
  ]
}