Десериализация XML с пустым массивом возвращает массив с одним объектом - PullRequest
4 голосов
/ 08 июля 2019

При десериализации XML, содержащего пустой массив, я ожидаю, что этот массив будет нулевым.Вместо этого я получаю массив с одним объектом, все свойства которого имеют значение 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 ]

3 голосов
/ 08 июля 2019

Вы должны использовать атрибут 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; }
}
0 голосов
/ 08 июля 2019

Вот что я считаю проблемой: вы сопоставляете тег <Items> (с as) с объектом со свойством Items (с as) из массива типов Item (без as), который отображается натег <Item> (без as), и это вызывает путаницу.

Имеет смысл, что там есть Item, потому что у вас есть тег <Items/> в вашем XML.И имеет смысл, что этот элемент является нулевым, потому что внутри тега нет ничего <Items/>

Я думаю, что XML с элементами в нем будет выглядеть примерно так:

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

В этомВ случае, если ваши Предметы будут одним списком элементов с объектом.Понимаете, о чем я?Попробуйте запустить код с несколькими тегами <Items> или без них, и вы увидите результат.

...