[英]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.