我试图将XDocument反序列化为包含数组/列表的类。问题是此代码无法执行此操作,我总是得到一个Response
类,该类没有任何清单项目(不是null,而是count = 0)
这是我的测试方法:
public void GetObj()
{
var xe = new XElement("Inventory");
var xe2 = new XElement("Id", "23");
xe.Add(xe2);
var list = new List<XElement>();
list.Add(xe);
list.Add(xe);
var doc = new XDocument(new XElement("Response", list));
var obj = doc.Deserialize<Response>();
}
这是我的扩展方法和模型:
public static class XDocumentExtensions
{
public static T Deserialize<T>(this XDocument doc)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
using (var reader = doc.Root.CreateReader())
{
return (T)xmlSerializer.Deserialize(reader);
}
}
public static XDocument Serialize<T>(this T value)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
XDocument doc = new XDocument();
using (var writer = doc.CreateWriter())
{
xmlSerializer.Serialize(writer, value);
}
return doc;
}
}
public class Response
{
public List<Inventory> Inventory { get; set; }
}
public class Inventory
{
public int Id { get; set; }
}
答案 0 :(得分:2)
诊断XML反序列化问题的最简单方法是在内存中构造模型实例并将其序列化,然后将输出XML与所需输入进行比较。因此,如果我这样做:
Console.WriteLine(new Response { Inventory = new List<Inventory> { new Inventory { Id = 23 } } }.Serialize() );
输出XML为:
<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Inventory>
<Inventory>
<Id>23</Id>
</Inventory>
</Inventory>
</Response>
如您所见,<Inventory>
元素还有一层嵌套。之所以出现该位置,是因为默认情况下,XmlSerializer
使用以序列化成员(此处为Inventory
)命名的外部容器元素元素以及每个项目的元素(默认情况下,命名为(默认))来序列化集合。项目类型(此处也是Inventory
)。演示小提琴#1 here。
如果您不想这样做,则需要像这样将[XmlElement]
添加到public List<Inventory>
:
public class Response
{
[XmlElement]
public List<Inventory> Inventory { get; set; }
}
现在Inventory
将在没有外部容器元素的情况下被序列化,因此您的反序列化代码将成功。演示小提琴#2 here。
(或者,您可以使用必要的额外嵌套级别构造XDocument
。)