![](/img/trans.png)
[英]How to deserialize JSON with unnamed collection of types using DataContractSerializer
[英]DataContractSerializer does not deserialize collection of objects
晚上好,我有以下XML:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<project xmlns="">
<title>MyProject</title>
<nodes>
<node>
<name>base</name>
<class>BaseNode</class>
</node>
<node>
<name>detail</name>
<class>DetailNode</class>
</node>
...
</nodes>
</project>
...我希望反序列化为以下对象结构,以便一个Project
包含一个“ Title”和一个NodeCollection
(后者又包含多个Node
元素):
[DataContract(Name = "project")]
class Project
{
[DataMember(Name = "title")]
public string Title { get; set; }
[DataMember(Name = "nodes")]
public NodeCollection Nodes { get; set; }
}
[CollectionDataContract(Name = "nodes", ItemName = "node")]
class NodeCollection : List<Node>
{
}
[DataContract(Name = "node")]
class Node
{
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "class")]
public string Class { get; set; }
}
使用此体系结构,反序列化可以顺利完成,并返回预期的Project
对象,但是:
Project对象上的Title属性设置为期望值,但是NodeCollection始终为空。 实际上,它甚至还没有初始化:
你调用的对象是空的
由于某种奇怪的原因,解串器“无法识别任何节点”。 我尝试添加KnownType
属性,但没有成功。
我究竟做错了什么?
如果您指定Namespace
和Order
属性,它将起作用。 否则,它将抱怨意外的名称空间或无法完全读取节点,并且由于某种原因,它期望Title
Nodes
之后。
[DataContract(Name = "project", Namespace="")]
public class Project
{
[DataMember(Name = "title",Order=1)]
public string Title { get; set; }
[DataMember(Name = "nodes", Order=2)]
public NodeCollection Nodes { get; set; }
}
[CollectionDataContract(Name = "nodes",Namespace="", ItemName = "node")]
public class NodeCollection : List<Node> { }
[DataContract(Name = "node", Namespace="")]
public class Node
{
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "class")]
public string Class { get; set; }
}
查看文档 ,
数据排序的基本规则包括:
- 如果数据协定类型是继承层次结构的一部分,则其基本类型的数据成员始终按顺序排列。
- 接下来的是当前类型的数据成员,这些成员没有按字母顺序设置DataMemberAttribute属性的Order属性。
- 接下来是设置了DataMemberAttribute属性的Order属性的所有数据成员。 这些按先后按Order属性的值排序,如果某个Order值中有多个成员,则按字母顺序排序。 订单值可能会被跳过。
因为“ N”按字母顺序排在“ T”之前,所以它期望NodeCollection
是第一个。 即使事情“乱序”,它仍然会反序列化(这看起来很奇怪,但这就是它的工作原理)-它只会用null填充那些对象/成员。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.