【问题标题】:How can I deserialize a list of DateTime objects?如何反序列化 DateTime 对象列表?
【发布时间】:2009-08-10 21:14:46
【问题描述】:

如果我有以下 XML 段:

<Times>
  <Time>1/1/1900 12:00 AM</Time>
  <Time>1/1/1900 6:00 AM</Time>
</Times>

当反序列化发生时,相应的属性应该是什么样子,将上述 XML 接受到 DateTime 对象列表中?

这可以将 XML 段反序列化为 string 对象列表:

[XmlArray("Times")]
[XmlArrayItem("Time", typeof(string))]
public List<string> Times { get; set; }

但是当我使用 DateTime 作为类型而不是字符串时(对于 List 类型和 XmlArrayItem 类型),我收到以下错误:

The string '1/1/1900 12:00 AM' is not a valid AllXsd value.

谢谢!

【问题讨论】:

  • 重新评论 - 是的,如果数据格式正确,您可以自动序列化/反序列化;查看更新。

标签: c# .net xml-serialization


【解决方案1】:

用DateTime,估计很大一部分问题是xml的格式不对;这不是日期的 xsd 标准......你能影响 xml 吗?否则,您可能不得不坚持使用字符串并在之后处理它。

更标准的 xml 将是:

<Times>
  <Time>1900-01-01T00:00:00</Time>
  <Time>1900-01-01T06:00:00</Time>
</Times>

例如:

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
public class Data
{

    [XmlArray("Times")]
    [XmlArrayItem("Time")]
    public List<DateTime> Times { get; set; }

    static void Main()
    {
        XmlReader xr = XmlReader.Create(new StringReader(@"<Data><Times>
  <Time>1900-01-01T00:00:00</Time>
  <Time>1900-01-01T06:00:00</Time>
</Times></Data>"));
        XmlSerializer ser = new XmlSerializer(typeof(Data));
        Data data = (Data) ser.Deserialize(xr);
        // use data
    }
}

【讨论】:

  • +1 谢谢!如果这就是问题所在,那么我可能会包含一个 XML 注释来准确说明这一点。我不认为这些值会经常改变(如果有的话)。 .NET 中是否有内置机制可以将 XML 元素值反序列化为 DateTime 对象,而无需使用您提供的格式(即,可能是我提供的转换器类或其他东西)?
  • 因为我只对时间(而不是日期)感兴趣,所以我现在使用 xsd:time。有效时间显示在本页底部:books.xmlschemata.org/relaxng/ch19-77311.html,并且可以反序列化为 .NET DateTime 对象。您提供的示例很有帮助。谢谢!
【解决方案2】:

最简单的方法是创建一个序列化的新属性而不是 Times 属性,并处理格式:

    [XmlIgnore]
    public IList<DateTime> Times { get; set; }

    [XmlArray("Times")]
    [XmlArrayItem("Time")]
    public string[] TimesFormatted
    {
        get
        {
            if (this.Times != null)
                return this.Times.Select((dt) => dt.ToString("MM/dd/yyyy hh:mm tt", CultureInfo.InvariantCulture)).ToArray();
            else
                return null;
        }
        set
        {
            if (value == null)
                this.Times = new List<DateTime>();
            else
                this.Times = value.Select((s) => DateTime.ParseExact(s, "MM/dd/yyyy hh:mm tt", CultureInfo.InvariantCulture)).ToList();
        }
    }

【讨论】:

  • 知道为什么这只适用于CultureInfo.InvariantCulture 和ParseExact 而不适用于CultureInfo.InvariantCulture 和“正常”Parse 吗?
【解决方案3】:

看看msdn的文章: http://msdn.microsoft.com/en-us/library/ms950721.aspx

它建议一个 DateTime 对象应该这样标记: [System.Xml.Serialization.XmlElementAttribute("发布日期", DataType="日期")]
public System.DateTime 发布日期;

【讨论】:

  • 在我的代码单中DateTime 不是问题List&lt;DateTime&gt;
猜你喜欢
  • 2015-10-06
  • 2018-08-17
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 2019-10-25
  • 2020-10-31
相关资源
最近更新 更多