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"
}
]
}