【问题标题】:Deserialization exception handling反序列化异常处理
【发布时间】:2013-10-29 09:41:50
【问题描述】:

如果我阅读了这个 xml:

 <?xml version="1.0"?>
 <Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <FontPath>sciezka</FontPath>
    <CodingCP852v2>44</CodingCP852v2>
    <LedText>Napismoj</LedText>
 </Settings>

反序列化将显示在内部异常中:

{"The string '44' is not a valid Boolean value."} 

现在我想从导致异常的字段的异常对象名称中读取(在这个例子中我应该得到“编码”)。该怎么做?

[Serializable]
public class Settings
{
    public string FontPath
    {
        get;
        set;
    }

    public bool Coding
    {
        get;
        set;
    }
}

try
{
     using (FileStream s = File.OpenRead(fileName))
     {
           XmlSerializer xs = new XmlSerializer(typeof(Settings));
                return (Settings)xs.Deserialize(s);
     }
}
catch (Exception ex)
{
     return new Settings();
}

【问题讨论】:

  • 我不得不问为什么首先要编码一个布尔值?
  • 您是否考虑过只显示异常文本?让我感到震惊的是,您希望允许这样的错误的唯一原因是因为您有用户可编辑的 xml 输入。您也可以将他们暴露在错误中,因为他们熟悉 xml。输入行号和列号,它们就拥有识别错误值所需的所有信息。
  • 这将是一个错误,除了元素的错误值之外,XML 文件中还有许多其他可能的错误。试图从损坏的文件中生成有用的信息是危险的,您的“有用信息”也很可能会损坏。让用户大吃一惊。您已经得到了一个很好的内部异常,它告诉用户确切地在文件中查找损坏的位置,不要帮助。

标签: c# xml exception deserialization


【解决方案1】:

XmlSerializer 将总是 抛出和InvalidOperationException。在您的情况下,内部异常将是 System.Xml.XmlException

此异常的文档向您展示了可能可用的属性。它们都不是错误节点的名称。 http://msdn.microsoft.com/en-us/library/system.xml.xmlexception.aspx

似乎获取名称的唯一方法是使用XmlReader 手动解析文档并自己检查类型。如果省略模式,这将为您提供对类型映射和验证的非常细粒度的控制。 http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.aspx

【讨论】:

    猜你喜欢
    • 2020-08-15
    • 2020-09-18
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多