【问题标题】:Deserializing XML with empty array returns an array with a single object使用空数组反序列化 XML 会返回一个包含单个对象的数组
【发布时间】:2019-07-08 14:21:15
【问题描述】:

在反序列化包含空数组的 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
    }
}

我得到了什么:

我一定是错过了什么?

【问题讨论】:

  • 我在想它,我有一个问题:如果它不是空的,里面的物品会是什么?
  • @Adam Bob - 类似的东西
  • 请注意 - 反序列化的对象包含一个空数组,这实际上比它为空更可取。

标签: c# .net xml deserialization


【解决方案1】:

您应该使用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; }
}

【讨论】:

    【解决方案2】:

    这就是我认为的问题:您正在将标记 &lt;Items&gt;(带有 as)映射到一个对象,该对象具有一个名为 Items(带有 as)的属性,该属性被映射到 Item(不带有 as)的类型数组标签&lt;Item&gt;(没有as),这会造成混乱。

    那里有一个 Item 确实有意义,因为您的 XML 中确实有一个 &lt;Items/&gt; 标记。这个 Item 为 null 确实有道理,因为标签 &lt;Items/&gt; 内没有任何内容

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

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

    在这种情况下,您的 Items 将是一个带有 item 对象的单项列表。明白我的意思吗? 尝试使用多个&lt;Items&gt; 标记或不使用任何标记运行您的代码,您会看到结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      相关资源
      最近更新 更多