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

如何调试.NET中的反序列化错误?,.net,debugging,serialization,deserialization,.net,Debugging,Serialization,Deserialization,.NET的反序列化错误非常普遍,例如: System.ArgumentException:的对象 无法转换类型“System.Uri” 键入“System.String” 很明显,我们更改了对象中属性的类型,但是在这个序列化对象中有10-15个不同的类,所以很难确定是哪一个更改了,还是哪一个提交搞砸了 是否仍然可以获取有关哪个类(或至少是哪个类)中的哪个属性实际导致此错误的信息?是否有任何外部工具或已知的方法来执行此操作 另外,在有人告诉我为什么我不应该使用二进制序列化程序,或者为什么我应该使用

.NET的反序列化错误非常普遍,例如:

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

很明显,我们更改了对象中属性的类型,但是在这个序列化对象中有10-15个不同的类,所以很难确定是哪一个更改了,还是哪一个提交搞砸了

是否仍然可以获取有关哪个类(或至少是哪个类)中的哪个属性实际导致此错误的信息?是否有任何外部工具或已知的方法来执行此操作


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

你可以做一些不同的事情,没有一件很棒。尤其是二进制序列化。您可以在接口中添加自定义序列化处理,这将允许您在调试器中逐步完成反序列化过程

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


但更简单的方法是查看源代码管理系统的日志,查找具有更改类型的方法

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


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

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

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

这有助于缩小问题的范围,特别是对于大型复杂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()

如果您没有更多信息,您是否看到InnerException?10-15对于调试来说听起来不是一个很大的数字;我不知道一个简单的方法来调试它-hand@MarcGravell:我认为@dr.evil意味着被反序列化的实例引用了10-15个其他不同的类,所有这些类(包括根)都可以具有不确定的
N
属性(即使只有一个类,您也有
N
属性),因此,可能有大量的属性需要涉猎。@casperOne是的,我痛苦地意识到尝试查找序列化错误的乐趣;p@DesignFirstInnerException是
Nothing
我们目前正在检查以前的版本以解决问题,但是我希望找到一个聪明的工具来帮助我。也许当我给它我的DLL,它可以反序列化和可视化的对象。太乐观了,嗯?:)是的,有很多地方.Net异常包含很少或没有信息。真丢脸。当您有自定义类时,配置类还会抛出一些非常神秘的异常消息。至少你知道这是一个类型更改,它为你提供了一个良好的开端。添加第一次机会异常和使用上述符号是一个很好的方法。好的,这听起来是个好主意,我来看看这个。在VS 2015和17中是CTRL+ALT+E,默认情况下如何知道它正在访问哪个属性。我得到的输入字符串格式不正确。我有一个很大的xml文件,它有很多属性。我想知道是哪一个导致了这个问题