gpt4 book ai didi

c# - 无法反序列化 XDocument

转载 作者:行者123 更新时间:2023-11-30 22:57:54 26 4
gpt4 key购买 nike

我正在尝试将 XDocument 反序列化为包含数组/列表的类。问题是这段代码没有这样做,我总是得到一个没有任何库存项目的 Response 类(不是 null,但计数 = 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; }
}

最佳答案

诊断 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 )对集合进行序列化。演示 fiddle #1 here .

如果你不想这样,你需要添加 [XmlElement] public List<Inventory>像这样:

public class Response
{
[XmlElement]
public List<Inventory> Inventory { get; set; }
}

现在Inventory将在没有外部容器元素的情况下进行序列化,因此您的反序列化代码将成功。演示 fiddle #2 here .

(或者,您可以使用必要的额外嵌套级别构建 XDocument。)

关于c# - 无法反序列化 XDocument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53334133/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com