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

C# 如何调试反序列化异常?,c#,serialization,xsd.exe,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文档235、17包含错误 该错误被描述为试图

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

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

在反序列化过程中读取XML时,我遇到一个异常:

enter System.InvalidOperationException was unhandled
HResult=-2146233079 Message=Het XML文档235、17包含错误

该错误被描述为试图将字符串转换为无法正确描述的日期时间格式

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


我的问题:你能帮我为这类问题提供一个好的调试策略吗?我想确切地知道异常发生在XML中的哪一行,但不知道如何做到这一点。

行和字符号通过实现报告给异常消息。需要注意的是,and仅在不可用时才以数字1和开始

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

如果XML格式不正确,那么错误将出现在line和position报告的位置

如果XML格式正确,但无法反序列化属性值,则具有错误值的属性将位于line和position报告的位置

但是,如果XML格式正确,并且无法反序列化元素值,则XML读取器将已经从元素的末尾前进到下一个XML读取器节点的开头,通常是打开或关闭元素,因此导致问题的元素将位于报告位置之前,可能在前一行

如果在0处报告错误,则读取器无法开始解析XML。可能的问题包括:

编码错误。请参见示例。 您正在使用StringReader读取字符串,并且在开始处嵌入了一个。有关详细信息,请参见示例。 输入根本不是XML。例如,它实际上是JSON,或者与服务器的错误响应相关联的文本消息。
为什么不能正确描述您的问题?235、17是发生错误的行和字符号,以及。也就是说,XML文件从第1行而不是第0行开始,该行的第一个字符是字符1而不是字符0。另请参见此处:。异常报告字符串到日期时间的转换对我来说没有意义,因为我在此应用程序中不使用日期时间数据类型。所以我真的很困惑。我今天会处理这个问题,看看所有好的建议是否对我有帮助。@RudolfJan-如果您发布异常的整个ToString输出,包括回溯,我们可能会提供更多帮助。感谢您的帮助和有用的澄清。我今天会处理它。谢谢您的帮助。在过去的几天里我学到了很多。我使用的XML非常复杂,随着时间的推移,新的数据结构已经添加,旧实例包含的数据比新实例少。架构不可用。我使用xsd.exe创建模式,但是xsd.exe将infor类型设置得非常严格,例如,日期值被创建为UnsignedByte。例如,当您尝试使用两位数的日期时,他的结果会出错。我使用XMLSpy验证了大量的示例,并决定接受并非所有XML文件都能同时正确反序列化的观点。我了解到,在大多数情况下,XDocument类是处理XML的一种更加复杂的方法。您可以避免使用XSDL文件的所有麻烦,尤其是当它们不可用时。