【问题标题】:XML Deserialization of a date with an empty value具有空值的日期的 XML 反序列化
【发布时间】:2009-05-08 04:33:32
【问题描述】:

我从一个供应商那里得到一个 xml 文件,其中有一些“空”日期,如下所示:

<UpdatedOn/>
<DeletedOn/>

通过执行常规反序列化失败:

内部异常:System.FormatException:字符串未被识别为有效的 DateTime。

任何想法如何处理这个?

我的字段已标记为默认DateTime

[System.Xml.Serialization.XmlElementAttribute(DataType="date")]
[System.ComponentModel.DefaultValueAttribute(typeof(System.DateTime), "1901-01-01")]
public System.DateTime UpdateOn{...}

【问题讨论】:

  • 您能确认一下准确 xml吗?那不是(据我所知)合法的xml。您可以放置​​ xml 而无需对其进行转义 - 内联在反引号 &lt;likeThis/&gt; 中 - 或者只需使用编辑器中的“代码”按钮将其缩进 4 个空格以获得更大(多行)的 xml 块。跨度>
  • ops...对不起... '' '' ....
  • Ta;已修复;供参考 - 那些(在你的“哎呀......对不起......”评论中)不是反引号 - 它们是单引号;反引号是倾斜的:`

标签: .net xml serialization


【解决方案1】:

我假设 xml 实际上类似于 &lt;UpdatedOn/&gt; / &lt;DeletedOn/&gt;?即空元素。

当涉及非标准格式时,一个有效的技巧是引入您自己的 shim 属性:

[Serializable]
public class Foo {
    [XmlIgnore]
    public DateTime Bar { get; set; }

    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    [XmlElement("Bar")]
    public string BarTransport {
        get {
            return Bar == DateTime.MinValue ? "" : XmlConvert.ToString(Bar);
        }
        set {
            Bar = string.IsNullOrEmpty(value) ? DateTime.MinValue
                : XmlConvert.ToDateTime(value);
        }
    }
}

这里,Foo.Bar 属性(实际的DateTime)在序列化期间不使用;相反,Foo.BarTransport 属性在 Bar 元素下序列化 - 但有特殊规则。您可以将DateTime.MinValue 替换为您希望视为空白/默认值的任何其他值。

请注意,如果您根本不想发送 Bar 元素,您可以编写 public bool ShouldSerializeBarTransport()XmlSerializer 将检查它 - 如果您返回 false,它将不会被写入。

【讨论】:

  • 感谢 Marc,这正是我想要的。我唯一改变的是 XmlConvert.ToDateTime(string) 的另一个重载的使用,因为这个已经过时了。谢谢。
【解决方案2】:

尝试将&lt;UpdatedOn/&gt;改为&lt;UpdatedOn xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /&gt;,就可以反序列化XML了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2012-05-09
    • 1970-01-01
    相关资源
    最近更新 更多