【问题标题】:XML deserialization, XML undefined property becomes an empty listXML反序列化,XML未定义属性变成空列表
【发布时间】:2021-05-23 21:39:11
【问题描述】:

当将 XML 反序列化为对象时,即使 XML 中没有该属性,该对象的属性也会变成一个空列表,预期的行为是该属性为空。

例如,给定一个类

public class MyFoo
{
    public string Id { get; set; }
    [XmlArrayItem(“Name”)]
    public List<string> Names { get; set; }

    public override string ToString()
    {
        // output the serialized xml
        return Serialization<MyFoo>.ObjectToXml(this, false, false, true);
    }
}

给定序列化的 XML

<MyFoo>
  <Id>1</Id>
</MyFoo>

如您所见,在序列化之前仅填充了属性“Id”。理论上,如果我们将此 XML 反序列化回对象,我们应该填充“Id”并且“Names”将为空。 事实上,反序列化后,属性“Names”被初始化为一个包含空元素的List。 如下

<MyFoo>
  <Id>1</Id>
  <Names />
</MyFoo>

为什么会这样?

【问题讨论】:

标签: .net xml


【解决方案1】:

变量Names 已通过类MyFoo 声明为对象的必需部分。如果序列化对象是Names,则唯一可以为null。

当您反序列化它时,XMLSerializer 会查找 MyFoo 的每个声明的元素。 在这种情况下,唯一相关的值是Id,因此它设置Id 并将Names 留空。

当您对其进行序列化时,首先它会创建一个 XML 节点,其中每个对象属性作为子节点(包括 Names),然后填充其中的每一个,在这种情况下不包括 Names

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多