【问题标题】:XMLSerialization doesn't set properties on de-serializationXMLSerialization 不设置反序列化的属性
【发布时间】:2013-07-17 22:46:03
【问题描述】:

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

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

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

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

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

谢谢

【问题讨论】:

  • 一个代码示例价值千言万语
  • @Lochemage,我很乐意,但这将是整个项目。我不知道如何减少问题

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


【解决方案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(当它在 IXmlSerializableReadXml(XmlReader reader) 方法中时)在完成后位于下一个元素的 StartElement 上,而不是在 EndElement 上。换句话说,请确保调用:

reader.ReadEndElement();

正因为如此,xml 反序列化阅读器获得了倾斜的数据并读取了错误位置的所有元素,从而产生了空值。

【讨论】:

  • 这在 Visual Studio 2017 中仍然有效。请注意,添加 tempFilesLocation 时,智能感知会添加一个波浪线并显示“不允许使用 tempFilesLocation 属性”。忽略这一点并重建允许我调试 *.cs 文件。此外,我需要的 randomname.cs 文件不会出现在 temp 目录中,直到我遇到反序列化发生的断点。完成此操作后,我能够通过 wsdl 生成的代码进行调试并确定问题的根源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 2013-10-09
  • 2021-05-22
  • 2021-11-22
相关资源
最近更新 更多