C#如何调试反序列化异常?

时间:2015-04-26 16:14:52

标签: c# serialization xsd.exe

我已经使用XSD.exe工具创建了一个代表XSD的C#类。 我使用valdiation代码来检查XML与XSD的一致性。 我有这个工作,但使用另一个XML文件会导致异常。

XML文件由外部程序生成,我无权访问原始代码或已发布的XSD。

在反序列化期间读取XML期间,我得到一个例外:

enter System.InvalidOperationException was unhandled

的HResult = -2146233079   Message = Het XML-document(235,17)包含错误。

该错误被描述为尝试将字符串转换为DateTime格式(这不是正确的描述)。

我认为(235,17)migt代表文档中的位置,但这与调用堆栈不一致。

我的问题:你能帮我解决这类问题的良好调试策略吗?我想确切地知道XML中的哪一行发生异常,但不知道如何执行此操作。

1 个答案:

答案 0 :(得分:3)

通过IXmlLineInfo interface实现的XmlTextReader将行号和字符号报告给异常消息。值得注意的是,line numberline position 都以头号开头(仅在不可用时为零)。

因此"(235, 17)"是错误抛出时读者所在位置的行号(从1开始)中的行号和位置。在大多数情况下,这将是发生错误的XML文件中的实际位置。但是,有时XML序列化程序会在抛出错误之前将读取器提升到下一个node。从实验:

  1. 如果XML格式不正确,那么错误将是行和位置报告的位置。

  2. 如果XML格式正确但属性值无法反序列化,那么具有错误值的属性将是行和位置报告的位置。

  3. 但是,如果XML格式正确并且元素值无法反序列化,那么XML阅读器已经超出了元素的末尾到下一个的开头XML阅读器节点(通常是打开或关闭的元素),因此引起问题的元素将在报告的位置之前立即,可能在上一行。

  4. 如果在(0, 0)报告错误,则读者无法开始解析XML。可能的问题包括: