繁体   English   中英

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对象,但是:

  • 项目“标题”已正确反序列化(其值为“ MyProject”),
  • 项目“节点”不是(空)。

Project对象上的Title属性设置为期望值,但是NodeCollection始终为空。 实际上,它甚至还没有初始化:

你调用的对象是空的

由于某种奇怪的原因,解串器“无法识别任何节点”。 我尝试添加KnownType属性,但没有成功。

我究竟做错了什么?

如果您指定NamespaceOrder属性,它将起作用。 否则,它将抱怨意外的名称空间或无法完全读取节点,并且由于某种原因,它期望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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM