1

我有一个奇怪的行为,我什至不知道如何诊断。

反序列化期间的某些属性未设置(null),即使我在(刚刚生成的)XML 文档中清楚地看到它们。对于类似类型的对象,XML 文档看起来结构良好且对称。

看起来它将值设置到某个点,然后停止设置值,然后忽略所有其他数据。

只是要指出 - 它正确设置的最后一个值是一个包含另一个对象的类型的对象,由于类似单例的反序列化问题,我不得不实现IXmlSerializable. 我指出这一点是因为它可能暗示一些错误,尽管我无法弄清楚它可能是什么。

编辑:我阅读了一些关于检索序列化程序集和代码的文章。出于某种原因,它只输出 .dll 和 .pdb 文件,而不是 .cs,正如文章中提到的那样

谢谢

4

1 回答 1

1

好的,解决了!这是一个两部分的解决方案:

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 反序列化阅读器获得了倾斜的数据并读取了错误位置的所有元素,从而产生了空值。

于 2013-07-18T00:30:25.963 回答