.net DateTime 序列化反序列化错误

.net DateTime Serialization Deserialization bug

如果您使用嵌入式 .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 日期...

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

所以同样的代码,"fixed",在第一种情况下应该是:

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 序列化程序才会出现的这个问题...