C# 如何反序列化DateTime对象列表?

C# 如何反序列化DateTime对象列表?,c#,.net,xml-serialization,C#,.net,Xml Serialization,如果我有以下XML段: <Times> <Time>1/1/1900 12:00 AM</Time> <Time>1/1/1900 6:00 AM</Time> </Times> 但是,当我使用DateTime作为类型而不是string(对于List类型和XmlArrayItem类型),我会得到以下错误: 字符串“1/1/1900 12:00 AM”不是有效的AllXsd值。 谢谢 对于DateTime,我认为问题

如果我有以下XML段:

<Times>
  <Time>1/1/1900 12:00 AM</Time>
  <Time>1/1/1900 6:00 AM</Time>
</Times>
但是,当我使用DateTime作为类型而不是string(对于List类型和XmlArrayItem类型),我会得到以下错误:

字符串“1/1/1900 12:00 AM”不是有效的AllXsd值。


谢谢

对于
DateTime
,我认为问题的很大一部分是xml的格式错误;这不是日期的xsd标准。。。你能影响xml吗?否则,您可能必须坚持使用字符串,然后再进行处理

更标准的xml是:

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

1900-01-01T00:00:00
1900-01-01T06:00:00
例如:

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
    }
}
使用系统;
使用System.Collections.Generic;
使用System.IO;
使用System.Xml;
使用System.Xml.Serialization;
公共类数据
{
[XmlArray(“Times”)]
[XmlArrayItem(“时间”)]
公共列表时间{get;set;}
静态void Main()
{
XmlReader xr=XmlReader.Create(新建StringReader(@)”
1900-01-01T00:00:00
1900-01-01T06:00:00
"));
XmlSerializer ser=新的XmlSerializer(typeof(Data));
数据=(数据)序列反序列化(xr);
//使用数据
}
}

看看msdn文章:

它建议将DateTime对象标记为: [System.Xml.Serialization.XmlElementAttribute(“发布日期”, DataType=“date”)]

public System.DateTime publicationdate

最简单的方法是创建一个新属性,该属性被序列化而不是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();
        }
    }
[XmlIgnore]
公共IList时间{get;set;}
[XmlArray(“Times”)]
[XmlArrayItem(“时间”)]
公共字符串[]已格式化
{
得到
{
如果(this.Times!=null)
返回此.Times.Select((dt)=>dt.ToString(“MM/dd/yyyy hh:MM tt”,CultureInfo.InvariantCulture)).ToArray();
其他的
返回null;
}
设置
{
如果(值==null)
this.Times=新列表();
其他的
this.Times=value.Select((s)=>DateTime.ParseExact(s,“MM/dd/yyyy hh:MM tt”,CultureInfo.InvariantCulture)).ToList();
}
}

+1谢谢!如果这是问题所在,那么我可能会包含一条XML注释,精确地说明这一点。我认为这些价值观不会经常改变(如果有的话)。在.NET中是否有一种内置机制,可以将XML元素值反序列化为DateTime对象,而不使用您提供的格式(例如,可能是我提供的转换器类或其他格式)?因为我只对时间(而不是日期)感兴趣,所以现在使用xsd:time。有效时间显示在此页底部:,可以反序列化为.NET DateTime对象。你提供的例子很有帮助。谢谢重新注释-是的,如果数据格式正确,您可以自动序列化/反序列化;请参阅update。是否知道为什么这只适用于
CultureInfo.InvariantCulture
ParseExact
,而不适用于
CultureInfo.InvariantCulture
和“normal”
Parse
?在我的代码中,单个
DateTime
不是问题
    [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();
        }
    }