【问题标题】:Diagnosing XML deserialization errors诊断 XML 反序列化错误
【发布时间】:2015-12-01 09:44:49
【问题描述】:

我被要求调试代码,该代码使用 XmlSerializer 类中的反序列化方法将具有大而复杂的 XML 的字符串反序列化为具有给定类型的大而复杂的 C# 对象。

XML 文档来自客户。 XML 文档通常存在问题,因此无法正确反序列化。例如,它可能有一个非数字值,必须进入某个数字字段。

当反序列化发现问题时,它会抛出异常,但这并不能告诉我是哪个 XML 元素和什么值导致了问题。这使得在 XML 文档中查找问题非常耗时。

是否有某种方法或工具可以帮助我查明 XML 文档中的特定 XML 元素和/或值?

【问题讨论】:

  • 见Troubleshooting Common Problems with the XmlSerializer。此外,根据我的经验,来自XmlSerializer 的异常通常 do 会给出 XML 行号以及问题的解释。你有没有发生这种情况的例子吗?
  • @dbc 谢谢,我阅读了该页面(其中确实有一些有趣的信息),但在我的特定情况下并没有多大用处。该异常确实告诉您出了什么问题(在我的情况下,将字符串转换为数字),但没有给您行号或字段名称。
  • 我无法重现您的问题。见dotnetfiddle.net/lfnUKU。在There is an error in XML document (X, Y) 中,"(X, Y)" 是发生异常时XmlReader 从 1 开始的行和字符位置。对于格式异常,阅读器已经前进到下一个标记,因此错误就在所述位置之前。

标签: c# xml serialization


【解决方案1】:

事实证明,当您反序列化字符串而不是 XML 文档时,异常中的诊断信息要好得多。

我试图反序列化一个 XML 文档:

// Deserializing XML document, exceptions don't give line numbers or fields 
XmlNode rootNode = ... XML document ... 
using (var reader = new XmlNodeReader(rootNode))
{
    var serializer = new XmlSerializer(typeof (T));
    return (T) serializer.Deserialize(reader);
}

但是,我发现如果你反序列化一个字符串,你会得到有问题的元素所在的行号(在 XML 字符串中)。

// Deserializing XML string, exceptions now give line number    
string serializedXmlString = .... XML string ...
using (var reader = new StringReader(serializedXmlString))
{
    var serializer = new XmlSerializer(typeof(T));
    return (T)serializer.Deserialize(reader);
}

【讨论】:

    猜你喜欢
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 2011-08-09
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多