当将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