XML反序列化,XML未定义属性变为空列表



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

例如,给定一个类

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"将为null。事实上,在反序列化之后,属性"Names"被初始化为List包含空元素。如下

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

为什么它会这样?

变量Names已通过位于类MyFoo中而声明为对象的强制部分。如果序列化对象,唯一可以为null的是Names

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

当您序列化它时,它首先创建一个XML节点,将每个对象属性作为子节点(包括Names(,然后填充其中的每一个,在本例中不包括Names

最新更新