簡體   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