用空数组反序列化XML返回一个带有单个对象的数组

时间:2019-07-08 14:21:15

标签: c# .net xml deserialization

反序列化包含空数组的XML时,我希望该数组为null。取而代之的是,我得到一个具有单个对象且所有属性都设置为null的数组。

课程:

[XmlRoot(ElementName = "item")]
public class Item
{
    [XmlElement(ElementName = "name")]
    public string Name { get; set; }
}

[XmlRoot(ElementName = "thing")]
public class Thing
{
    [XmlElement(ElementName = "items")]
    public Item[] Items { get; set; }
}

XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<thing>
  <items/>
</thing>

测试:

[Fact]
public void DeserializeTest()
{
    var xml = ""; // XML here

    var serializer = new XmlSerializer(typeof(Thing));

    using (TextReader reader = new StringReader(xml))
    {
        var thing = serializer.Deserialize(reader) as Thing;

        thing.Items.Should().BeNull(); // fails
    }
}

我得到的是: enter image description here

我一定想念什么吗?

2 个答案:

答案 0 :(得分:3)

您应使用XmlArray属性定义数组。该声明应该起作用:

[XmlRoot("item")]
public class Item
{
    [XmlElement("name")]
    public string Name { get; set; }
}

[XmlRoot(ElementName = "thing")]
public class Thing
{
    [XmlArray("items")]
    public Item[] Items { get; set; }
}

答案 1 :(得分:0)

这是我认为的问题所在:您正在将标签<Items>(带有as)映射到具有Item(不带有as)类型数组的名为Items(带有as)的属性的对象。映射到标签<Item>(不带as),这会造成混乱。

因为在XML中确实有一个<Items/>标签,所以确实有一个Item是有意义的。而且,该Item为null确实很有意义,因为标签<Items/>

中没有任何内容

我认为其中包含项目的XML类似于:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<thing>
  <items>
    <item name="some name"/>
  </items>
</thing>

在这种情况下,您的项目将是一个包含项目对象的项目列表。明白我的意思吗? 尝试使用多个<Items>标签或不添加任何标签来运行代码,您将看到结果。