【问题标题】:How do I serialize DateTime properly?如何正确序列化 DateTime?
【发布时间】:2011-09-13 18:18:06
【问题描述】:

当我对我的 DateTime 字段(具有来自日期选择器的值)进行 XML 序列化时,日期总是被序列化为

0001-01-01T00:00:00

即公元 1 月 1 日。为什么是这样?此外,当我尝试反序列化 XML 时,我收到此错误:

startIndex 不能大于字符串长度。
参数名称:startIndex。

但是,当我手动编辑 XML 时,反序列化在 1000 到 9999 年间运行良好,但在

DateTime 属性具有 [XmlElement],就像所有其他正确序列化的字段一样,其余代码似乎没问题。提前致谢!

【问题讨论】:

  • 序列化时的日期时间值是多少?
  • Snowbear,解释一下 serializ 中的内容会很复杂。代码,作为初学者,我可能遗漏了一些明显的东西。禅,不,但谢谢。 DevX,日期来自日期选择器控件。由于序列化值始终是 1 月 1 日,我可能错过了与日期选择器的连接,但我不知道在哪里?
  • 我想说你的序列化代码可能工作得很好:) 看起来你的日期值不知何故丢失了——很可能与 DateTime 是一种值类型的事实有关......

标签: c# xml datetime serialization


【解决方案1】:

如果你想轻松序列化(并掌握它的序列化),请使用代理字段。

[Serializable]
public class Foo
{
    // Used for current use
    [XmlIgnore]
    public DateTime Date { get; set; }

    // For serialization.
    [XmlElement]
    public String ProxyDate
    {
        get { return Date.ToString("<wanted format>"); }
        set { Date = DateTime.Parse(value); }
    }
}

编辑

以下代码:

[Serializable]
public class TestDate
{
    [XmlIgnore]
    public DateTime Date { get; set; }

    [XmlElement]
    public String ProxyDate
    {
        get { return Date.ToString("D"); }
        set { Date = DateTime.Parse(value); }
    }
}

public class Program
{
    static void Main(string[] args)
    {
        TestDate date = new TestDate()
        {
            Date = DateTime.Now
        };

        XmlSerializer serializer = new XmlSerializer(typeof(TestDate));
        serializer.Serialize(Console.Out, date);
    }
}

产生以下输出:

<?xml version="1.0" encoding="ibm850"?>
<TestDate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http:
//www.w3.org/2001/XMLSchema">
  <ProxyDate>mardi 14 juin 2011</ProxyDate>
</TestDate>

【讨论】:

  • 不,我做了所有这些,但仍然没有帮助。序列化本身有效(并且有效),但无论格式如何,日期始终保存为 1st Jan 1AD?
  • 查看我的编辑,工作正常,生成的 XML 中没有 AD,看来您的代码有错误。
  • 我的 xml 中也没有 AD,它是 0001-01-01T00:00:00(实际上是公元 1 年的 1 月 1 日)。显然 datepicker 的链接是我的代码中缺少的东西。
猜你喜欢
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
相关资源
最近更新 更多