【问题标题】:XML Serialization of a List<DateTime> using a custom datetime format使用自定义日期时间格式的 List<DateTime> 的 XML 序列化
【发布时间】:2014-06-22 15:37:03
【问题描述】:

我在使用 XML 序列化时遇到了一些问题。 (可能类似于THIS SO QUESTION,但关于序列化而不是反序列化)。 我需要使用自定义的 DateTime 格式序列化 List&lt;DateTime&gt;。 我可以为单个 DateTime 变量执行此操作,但我不知道如何为列表执行此操作。

这是我想要在我的代码中做的事情。

对于简单的DateTime 变量,我使用以下代码:

[XmlType("Time")]
public class Time : BaseClass
{
    public Time()
    {
        base.Name = string.Empty;
        StartTimeDt = DateTime.Now;            
    }

    [XmlIgnore]
    public DateTime StartTimeDt
    {
        get { return DateTime.Parse(StartTime); }
        set { StartTime = value.ToString("yyyy-MM-dd HH:mm:ss.fff"); }
    }

    [XmlAttribute("StartTime")]
    public string StartTime { get; set; }
}

获取此 XML 结构:

<Time Name="" StartTime="2014-05-05 11:00:00.000">

当我创建Time 类的新实例并对其进行序列化时,我获得了我期望的XML 结构,我的StartTime 变量使用自定义日期时间格式序列化。

当我有List&lt;DateTime&gt; 时,我尝试使用这种代码:

[XmlType("Calendar")]
public class Calendar : BaseClass
{
    public Calendar()
    {
        base.Name = string.Empty;
        DaysDt = new List<DateTime>();
    }

    [XmlIgnore]
    public List<DateTime> DaysDt
    {
        get { return Days.Select(item => DateTime.Parse(item)).ToList(); }
        set { Days = value.Select(item => item.ToString("yyyy-MM-dd")).ToList(); }
    }

    [XmlArrayItem("Day", typeof(string))]
    public List<string> Days { get; set; }
}

生成此 XML 输出:

<Calendar Name="">
    <Days>
        <Day>2014-03-02</Day>
        <Day>2014-05-03</Day>
        <Day>[…]</Day>
    </Days>
</Annual>

但我做的事情显然是错误的,因为当我创建 Calendar 类的新实例并尝试添加一些日期时间时

Calendar calendar = new Calendar();
calendar.DaysDt = new List<DateTime>();
calendar.DaysDt.Add(DateTime.Now);
calendar.DaysDt.Add(DateTime.Now.AddDays(5));
calendar.DaysDt.Add(DateTime.Now.AddDays(10));

我的 DaysDtDays 列表总是包含 0 个对象,当我进行序列化时,它什么都不序列化...

此示例代码中有任何明显的错误吗?我很确定我在使用自定义格式的 List&lt;DateTime&gt;List&lt;string&gt; 之间的转换中犯了一些错误......

【问题讨论】:

    标签: c# xml list datetime serialization


    【解决方案1】:

    您发布的代码有错误。

    没有序列化是合理的。 DaysDt 对象未序列化(因为您设置了 XmlIgnore 属性)并且您从不在 Days 对象上分配任何值。我想您可能混淆了获取/设置与将项目添加到列表。

    当你执行时:

    calendar.DaysDt.Add(DateTime.Now);
    

    setter 没有被调用! 这样一来,您就会得到一个空的 Days 对象。

    试试这个代码,看看它是否有效:

    Calendar calendar = new Calendar();
    List<DateTime> lst = new List<DateTime>();
    lst.Add(DateTime.Now);
    lst.Add(DateTime.Now.AddDays(5));
    lst.Add(DateTime.Now.AddDays(10));
    calendar.DaysDt = lst;
    

    【讨论】:

    • 谢谢,你是对的!我太热衷于 Xml 属性和日期时间/字符串解析,以至于我没有注意到这个错误!
    猜你喜欢
    • 2010-09-23
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多