【问题标题】:How to debug deserialization errors in .NET?如何调试 .NET 中的反序列化错误?
【发布时间】:2011-02-03 13:36:32
【问题描述】:

.NET 的 Deserilization 错误非常普遍,例如:

System.ArgumentException: 对象 类型“System.Uri”无法转换 输入“System.String”。

很明显,我们更改了对象中属性的类型,但在这个序列化对象中大约有 10-15 个不同的类,因此很难弄清楚我们更改了哪一个或哪个提交搞砸了。

是否有任何关于哪个类(或至少在哪个类)中的哪个属性实际导致此错误的信息?是否有任何外部工具或已知方法可以做到这一点?

附注在有人开始告诉我为什么我不应该使用二进制序列化程序或为什么我应该使用 X、Y 等以实现向后兼容性之前,请保存这些建议。我知道所有这些,但这不是问题。

【问题讨论】:

  • 如果您没有更多信息,您是否看到 InnerException?
  • 10-15 对于调试而言听起来并不是一个很大的数字;我不知道一个简单的方法来调试那个副手
  • @Marc Gravell:我认为@dr。 evil 意味着被反序列化的实例引用了 10-15 个其他不同的类,所有这些(包括根)都可以具有不确定的 N 属性(即使只有一个类,您也有 N 属性),因此可能会涉及大量属性。
  • @casperOne 是的,我痛苦地意识到尝试定位序列化错误的乐趣;p
  • @DesignFirst InnerException 是 Nothing

标签: .net debugging serialization deserialization


【解决方案1】:

如果您启用对框架代码的调试(请参阅this 链接),然后按 ctrl + shift + e 并选择所有托管代码异常,则错误将出现在实际失败的源代码行中。然后,您应该能够使用堆栈跟踪来找出它当时试图反序列化的对象的哪一部分。

这并不容易,但我们最终就是这样做的。

【讨论】:

  • 添加第一次机会例外并使用上述符号是一种很好的方法。
  • 好吧,这听起来是个好主意,我会看看这个。
  • VS 2015 & 17默认是CTRL+ALT+E
【解决方案2】:

您可以做几件不同的事情,但都不是很好。尤其是二进制序列化。您可以使用ISerializable 接口添加自定义序列化处理,这将允许您在调试器中逐步完成反序列化过程。

您是否考虑过切换到 Xml 序列化以用于开发/调试目的?还有一些钩子可以用于 Xml 序列化。但这听起来对您不起作用,因为您可能正在处理需要读取的远程接口或存储在磁盘上的旧二进制数据。

但更简单的方法是查看源代码控制系统的日志以查找类型已更改的方法。

【讨论】:

  • 我们目前正在检查以前的版本以解决问题,但是我希望找到一个聪明的工具来帮助我。也许当我给它我的 DLL 时,它可以反序列化和可视化对象。太乐观了吧? :)
  • 是的,有很多地方 .Net 异常包含很少或没有信息。真丢人。当您有自定义类时,配置类也会抛出一些非常神秘的异常消息。至少你知道它是一种类型的改变,这让你有一个良好的开端。
【解决方案3】:

查看内部堆栈跟踪可能很有用。 序列化程序会生成一个专门用于处理您想要序列化/反序列化的类型的类。

只需查看堆栈跟踪中涉及的函数的函数名称,您就可以跟踪哪个节点节点正在中断。

这有助于缩小问题所在,尤其是对于大型复杂 XML 文件。

例子:

  at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
   at System.Xml.XmlConvert.ToInt32(String s)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read13_Item(Boolean isNullable, Boolean checkType) //Tells you the issue is on the RootNodeSubNodeSubSubNode on an item withing it.
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read17_RootNodeSubNodeSubSubNode(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read26_RootNodeSubNode(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read50_RootNode(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderXML.Read51_RootNode()

【讨论】:

  • 如何知道它正在访问哪个属性。我得到输入字符串的格式不正确。我有很多属性的大 xml 文件。我想知道是哪一个导致了问题
猜你喜欢
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 2016-09-23
  • 2014-11-15
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多