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

dr.*_*vil 21 .net debugging serialization deserialization

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

System.ArgumentException:"System.Uri"类型的对象无法转换为"System.String"类型.

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

反正有没有获取有关哪个类(或至少在哪个类中)实际导致此错误的属性的信息?有没有外部工具或已知的方法来做到这一点?

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

Mat*_*les 8

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

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


Mon*_*nch 1

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

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

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