XMLSerialization';t设置反序列化的属性

本文关键字:反序列化 属性 设置 XMLSerialization | 更新日期: 2023-09-27 18:23:35

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

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

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

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

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

感谢

XMLSerialization';t设置反序列化的属性

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

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(当它在IXmlSerializableReadXml(XmlReader reader)方法中时)在下一个元素的StartElement上,而不是在EndElement上。换句话说,一定要打电话:

reader.ReadEndElement();

正因为如此,xml去相关化读取器得到了扭曲的数据,并读取了错误位置的所有元素,从而产生了null。