【问题标题】:Handling FormatExceptions using XmlSerializer.Deserialize使用 XmlSerializer.Deserialize 处理 FormatExceptions
【发布时间】:2010-03-21 02:30:40
【问题描述】:

我有一个返回此 xml 的第三方 Web 服务

<book>
  <release_date>0000-00-00</release_date>
</book>

我正在尝试将其反序列化到此类中

public class Book
{
    [XmlElement("release_date")]
    public DateTime ReleaseDate { get; set; }
}

但是因为0000-00-00 不是有效的DateTime,我得到了一个FormatException。处理这个问题的最佳方法是什么?

【问题讨论】:

    标签: .net xmlserializer formatexception


    【解决方案1】:

    如果第 3 方架构将该字段定义为日期时间,那么它应该始终包含有效的日期时间值,除非出现问题。 在这种情况下,您可以考虑将其反序列化为字符串

    public class Book
    {
        [XmlElement("release_date")]
        public string ReleaseDate { get; set; }
    
        public DateTime? GetReleaseDate 
        { 
          get 
          {
               // parse ReleaseDate datetime string
               // return the value; or null if the string contains invalid datetime.
          }
        }
    }
    

    【讨论】:

    • 第三方不是 .net,所以不一定是 DateTime,因此是 0000-00-00。您建议的字符串方法是我也做过的,但感觉很hacky,希望可能有一个更清洁的解决方案
    • WSDL 中描述了哪种类型的 release_date?细绳?或者没有WSDL,在这种情况下,它应该先反序列化为字符串,然后再应用你自己的逻辑。
    【解决方案2】:
    public class Book
    {
        [XmlElement("release_date")]
        public string StringReleaseDate
        {
            get {return ReleaseDate.ToString("yyyy-MM-dd");}
            set {ReleaseDate = DateTime.ParseExact(value, "yyyy-MM-dd");}
        }
    
        [XmlIgnore]
        public DateTime ReleaseDate {get;set;}
    }
    

    【讨论】:

    • 您的代码示例不会改进。通过将DateTime.ParseExact() 放入StringReleaseDate 的设置器中,您仍然会在反序列化时获得 FormatException。 @ray-lu 提供的答案更好,因为在反序列化时 ReleaseDate 不会抛出。稍后访问GetReleaseDate 的getter 时会出现异常(如果有)。您可以通过使用DateTime.TryParseExact() 并在失败时返回null 来完全避免该异常。
    • 为什么你认为返回 null 是个好主意?最好抛出异常并修复问题,而不是隐藏问题。
    • 我提到了DateTime.TryParseExact()null,因为@ray-lu 的回答将GetReleaseDate 声明为Nullable&lt;DateTime&gt;,这意味着null 是一个合适的getter 响应。在 .NET 反序列化记录时抛出异常几乎是不合适的——我更喜欢通过SoapException 或侧通道(如 GUI 或电子邮件)显示错误信息,以便负责方可以看到错误信息信息以及拒绝的原因。如果FormatException 出现在XmlReader 中,那么您将没有可用于报告该信息的数据。
    • SoapException 是一个异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    相关资源
    最近更新 更多