好的,解决了!这是一个两部分的解决方案:
1) 启用诊断
首先,在 Visual Studio 2012 中(或者在 .NET 4.5 中可能更正确),在 app.config 中为 XmlSerialization 诊断设置以下内容是不够的:
<system.diagnostics>
<switches>
<add name="XmlSerialization.Compilation" value="1" />
</switches>
</system.diagnostics>
<system.xml.serialization>
<xmlSerializer tempFilesLocation="c:\foo"/>
</system.xml.serialization>
您还需要添加属性useLegacySerializerGeneration="true"
以生成序列化程序的自动生成的 .cs 文件
<system.diagnostics>
<switches>
<add name="XmlSerialization.Compilation" value="1" />
</switches>
</system.diagnostics>
<system.xml.serialization>
<xmlSerializer tempFilesLocation="c:\foo" useLegacySerializerGeneration="true"/>
</system.xml.serialization>
2) IXmlSerializable 实现中的陷阱
确保 XmlReader(当它在 的ReadXml(XmlReader reader)
方法中IXmlSerializable
)在完成后位于下一个元素的StartElement上,而不是在 EndElement 上。换句话说,请确保调用:
reader.ReadEndElement();
正因为如此,xml 反序列化阅读器获得了倾斜的数据并读取了错误位置的所有元素,从而产生了空值。