【问题标题】:.net DateTime Serialization Deserialization bug.net DateTime 序列化反序列化错误
【发布时间】:2016-03-29 14:28:53
【问题描述】:

如果您使用嵌入式 .net JavaScriptSerializer 对 DateTime 进行序列化和反序列化,如果您使用的是 UTC+something,则会得到两个不同的日期!

示例(假设您像我现在一样在 UTC+2)

JavaScriptSerializer myJson = new JavaScriptSerializer();

DateTime myDate = DateTime.Now; //suppose 2016-03-29 16:12:00
strSerialized = myJson.Serialize(myDate);

//DO WHAT YOU NEED WITH IT...

DateTime myDateDes = myJson.Deserialize<DateTime>(strSerialized);
Label1.Text=myDateDes.ToString();//it gives you 2016-03-29 14:12:00 ! WRONG! IT's in UTC+0 ! Has 2 HOURS less !!!

所以,当你得到反序列化的日期时,它会默认为你提供 UTC+0 值...!!

这与JavaScriptSerializer UTC DateTime issues 不同,因为那篇文章描述了不同日期时间数据类型的反序列化差异,并提供了无法解决问题的解决方案 (.UtcDateTime)。事实上,尝试用 .utcDateTime 反序列化一个序列化的 DateTime 总是会给你错误的 UTC+0 日期...

【问题讨论】:

  • 我猜你想序列化/反序列化一个 DateTimeOffset 对象。
  • 在我的情况下,我需要 DateTime ... DateTimeOffset 为我提供了 utc 偏移量,例如 29/03/2016 17:00:23 +02:00 但它总是在之后转换为 utc+0反序列化 (29/03/2016 15:00:23 +00:00)。这对于了解背后发生的事情很有用,但在我的情况下,我只需要...反序列化我序列化的内容,而不是更改后的 utc 版本...
  • 我相信这实际上是 .net 序列化程序中的一个已知错误。
  • 您的期望中存在错误,不一定在实现中。 JSON 字符串 "2016-03-29 16:12:00" (或它序列化的任何内容,您没有显示)应该是什么意思,为什么?该字符串中没有时区信息,因此序列化程序必须做出 some 假设。这个假设与您所做的假设不同,但这并不意味着它是一个错误。

标签: c# asp.net datetime serialization javascriptserializer


【解决方案1】:

有两种不同的解决方案:在反序列化时使用 ToLocalTime() 或使用 Newtonsoft.Json。

所以相同的代码,“固定”,在第一种情况下应该是:

JavaScriptSerializer myJson = new JavaScriptSerializer();

DateTime myDate = DateTime.Now; //suppose 2016-03-29 16:12:00
strSerialized = myJson.Serialize(myDate);

//DO WHAT YOU NEED WITH IT...

DateTime myDateDes = myJson.Deserialize<DateTime>(strSerialized).ToLocalTime();

Label1.Text=myDateDes.ToString();//it gives you 2016-03-29 16:12:00 !!! CORRECT !

否则,使用 Newtonsoft.Json(首先需要从 nuGet 安装,然后在顶部添加“using Newtonsoft.Json”),并像这样使用它:

DateTime myDate = DateTime.Now; //suppose 2016-03-29 16:12:00
strSerialized = JsonConvert.SerializeObject(myDate);

//DO WHAT YOU NEED WITH IT...

DateTime myDateDes = JsonConvert.DeserializeObject<DateTime>(strSerialized);
Label1.Text=myDateDes.ToString();//NO need to convert to LocalTime... it already gives you 2016-03-29 16:12:00 !!! CORRECT !

我希望这对其他人有用...我在 Google 上搜索了很多,但没有发现只有 Microsoft 序列化程序才会出现的这个问题...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 2014-02-19
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多