反序列化包含空数组的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
}
}
我一定想念什么吗?
答案 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>
标签或不添加任何标签来运行代码,您将看到结果。