如何在.NET中调试反序列化错误?

时间:2011-02-03 13:36:32

标签: .net debugging serialization deserialization

.NET的Deserilization错误非常通用,例如:

  

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

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

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

P.S。在任何人开始告诉我为什么我不应该使用二进制序列化器或为什么我应该使用X,Y代替等以实现向后兼容之前,请保存这些建议。我知道所有这些,但这不是问题。

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:1)

你可以做几件不同的事情,但都不是很好。特别是二进制序列化。您可以使用ISerializable接口添加自定义序列化处理,这样您就可以在调试器中逐步执行反序列化过程。

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

但更简单的方法是查看源控制系统的日志,了解更改类型的方法。

答案 2 :(得分:1)

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

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

这有助于缩小问题所在,尤其是对于大型复杂的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()