无法反序列化XDocument

时间:2018-11-16 08:37:00

标签: c# deserialization linq-to-xml xmlserializer xml-deserialization

我试图将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; }
}

1 个答案:

答案 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。)