.net 使用XmlSerializer.Deserialize处理格式化异常

.net 使用XmlSerializer.Deserialize处理格式化异常,.net,xmlserializer,formatexception,.net,Xmlserializer,Formatexception,我有一个返回此xml的第三方web服务 <book> <release_date>0000-00-00</release_date> </book> 但是因为0000-00-00不是有效的DateTime,所以我得到了一个FormatException。处理此问题的最佳方法是什么?如果第三方架构将该字段定义为datetime,则除非出现问题,否则该字段应始终包含有效的datetime值。 在这种情况下,可以考虑将其反序列化为字符串。 publ

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

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

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

如果第三方架构将该字段定义为datetime,则除非出现问题,否则该字段应始终包含有效的datetime值。 在这种情况下,可以考虑将其反序列化为字符串

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.
      }
    }
}

如果第三方架构将该字段定义为datetime,则除非出现问题,否则该字段应始终包含有效的datetime值。 在这种情况下,可以考虑将其反序列化为字符串

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,因此不一定是日期时间,因此0000-00-00。您所建议的字符串方法也是我所做的,但它感觉很粗糙,希望有一个更干净的解决方案WSDL中描述了什么类型的发布日期?一串或者没有WSDL,在这种情况下,应该首先将其反序列化为字符串,然后应用您自己的逻辑。恐怕第三方不是.net,所以不一定是DateTime,因此0000-00-00。您所建议的字符串方法也是我所做的,但它感觉很粗糙,希望有一个更干净的解决方案WSDL中描述了什么类型的发布日期?一串或者没有WSDL,在这种情况下,应该首先将其反序列化为字符串,然后应用您自己的逻辑。通过将
DateTime.ParseExact()
放在
StringReleaseDate
的setter中,在反序列化时仍然会出现FormatException。@raylu提供的答案更好,因为在反序列化时ReleaseDate不会抛出。当访问
GetReleaseDate
的getter时,异常(如果有)会在稍后出现。通过使用
DateTime.TryParseExact()
并在失败时返回
null
可以完全避免异常。为什么您认为返回null是个好主意?最好抛出异常并修复问题,而不是隐藏问题。我提到了
DateTime.TryParseExact()
null
,因为@ray lu的回答将
GetReleaseDate
声明为
null
,这意味着
null
是一个合适的getter响应。当.NET对记录进行反序列化时,抛出异常几乎是不合适的-我更喜欢通过
SoapException
或旁侧通道(如GUI或电子邮件)显示错误信息,以便责任方可以看到错误信息以及其被拒绝的原因。如果
XmlReader
中发生
FormatException
,则您将没有可用的数据来报告该信息。SoapException是一个异常。您的代码示例不会改善情况。通过将
DateTime.ParseExact()
放在
StringReleaseDate
的setter中,在反序列化时仍然会出现FormatException。@raylu提供的答案更好,因为在反序列化时ReleaseDate不会抛出。当访问
GetReleaseDate
的getter时,异常(如果有)会在稍后出现。通过使用
DateTime.TryParseExact()
并在失败时返回
null
可以完全避免异常。为什么您认为返回null是个好主意?最好抛出异常并修复问题,而不是隐藏问题。我提到了
DateTime.TryParseExact()
null
,因为@ray lu的回答将
GetReleaseDate
声明为
null
,这意味着
null
是一个合适的getter响应。当.NET对记录进行反序列化时,抛出异常几乎是不合适的-我更喜欢通过
SoapException
或旁侧通道(如GUI或电子邮件)显示错误信息,以便责任方可以看到错误信息以及其被拒绝的原因。如果
XmlReader
中发生
FormatException
,则您将没有可用数据来报告该信息。SoapException是一个异常。
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;}
}