【问题标题】:C# how can I debug a deserialization exception?C#如何调试反序列化异常?
【发布时间】:2023-03-28 17:25:01
【问题描述】:

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

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

在反序列化期间读取 XML 时出现异常:

enter System.InvalidOperationException was unhandled

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

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

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

我的问题:对于这类问题,您能帮我制定一个好的调试策略吗?我想确切地知道异常发生在 XML 中的哪一行,但不知道该怎么做。

【问题讨论】:

  • 为什么不能正确描述您的问题?
  • "(235, 17)" 是发生错误的行号和字符号where the first line is line onethe first character is character one。 IE。 XML 文件从第 1 行而不是第 0 行开始,并且该行的第一个字符是字符 1 而不是字符 0。
  • 异常报告 String 到 DateTime 的转换对我来说没有意义,因为我在此应用程序中不使用 DateTime 数据类型。所以我真的很困惑。我今天将解决这个问题,看看所有好的建议是否对我有帮助。
  • @RudolfJan - 如果您发布包括回溯在内的异常的整个ToString() 输出,我们可能会提供更多帮助。

标签: c# serialization xsd.exe


【解决方案1】:

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

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

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

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

  3. 1234563 XML 阅读器节点(通常是元素打开或关闭),因此导致问题的元素将是紧邻报告位置之前的一个元素,可能在上一行。
  4. 如果在(0, 0) 报告错误,则阅读器无法开始解析 XML。可能的问题包括:

【讨论】:

  • 感谢您的帮助和有用的澄清。我今天将继续努力。
  • 感谢您的帮助。在过去的几天里,我学到了很多东西。我使用的 XML 很复杂,并且随着时间的推移添加了新的数据结构,旧实例包含的数据少于新实例。架构不可用。我使用 xsd.exe 创建模式,但 xsd.exe 将类型 infor 设置得相当严格,例如日期值创建为 UnsignedByte。例如,当您尝试使用两位数的日期时,他会导致错误。我使用 XMLSpy 来验证大量样本,我决定接受并非所有 XML 文件都会一次正确反序列化。
  • 这个问题是很久以前的。我了解到,在大多数情况下,XDocument 类是使用 XML 的一种更简单的方法。您可以避免使用 XSDL 文件的所有麻烦,尤其是在它们不可用的情况下。
猜你喜欢
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多