XMLSerialization不会在反序列化时设置属性

时间:2013-07-17 22:46:03

标签: c# xml-serialization xml-deserialization ixmlserializable

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

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

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

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

修改: 我阅读了有关检索序列化程序集和代码的some articles。出于某种原因,它只输出.dll和.pdb文件,但不输出.cs,如文章所述

由于

1 个答案:

答案 0 :(得分: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 deseralization reader得到了偏斜的数据并读取了错误位置的所有元素,产生了空值。