我在学习Fishli李老师的博客时,看到一个话题,就是DateTime持久化, 还有人驳斥他的文章,弄的我迷糊了,于是花了点时间,一探究竟,顺便做一个总结 直接上结论: * 1. DateTime是结构体
JavaScriptSerializer不能持久化的原因有两个: 1. 不保存时差值 2.精度和DateTime的精度不一致 DataContractJsonSerializer和Newtonsoft.Json(版本<=4.5)不能持久化的原因有一个: 1. .精度和DateTime的精度不一致 总结: 不能持久的关键原因为: "\/Date(991+0800)\/" , 微软格式的精度和DateTime的精度不一致, 是不是javascript的Date的精度就到毫秒,微软顾及javascript, 懂的来说说吧.. Newtonsoft.Json的行为是这样的。 <=4.5,也是序列化成微软的datetime json格式,e.g. "\/Date(1198908717056+0800)\/". >4.5,序列化成ISO标准时间格式,"2016-05-05T14:59:30.4617225+08:00" , 精确到小数点7位了, 精度和DateTime一致了
于是我下载了5.0.1版本的Newtonsoft. 试了下, 的确可以持久化了. var settings = new JsonSerializerSettings(); settings.DateFormatHandling = DateFormatHandling.IsoDateFormat; // 如果要输出ISO标准时间,可以通过dateTimeFormat进行设置。 string s0 = JsonConvert.SerializeObject(dt_loc, settings); DateTime Newtonsoft_dt2 = JsonConvert.DeserializeObject<DateTime>(s0); dt_loc == Newtonsoft_dt2 为 true
结论就是: Newtonsoft.Json(版本>4.5) 能持久化的关键原因就是, 序列化时采取ISO标准, 保存了时差, 保持了精度,所以反序列化时才能原原本本的还原. 那篇反驳的文章则验证持久化的方法不对, 他将序列化后的JSON字符结果放到javascript中能够解析出时间, 就认为持久化没有问题, 但是他没有注意, JSON字符里的Ticks 和 DateTime里的Ticks 精度并不一样, JSON字符里的Ticks的精度只到1毫秒, 而 DateTime里的Ticks的精确到0.1微秒, 验证持久化最简单的办法就是, 判断一下Kind是否一致, 再验证一下Ticks是否一致 , 最后就是 dt1 == dt2 是否返回true啊, 他这三个一个没验证, 竟然就说持久化没问题,太不严谨了,还是严谨点好, 不然理解总是有偏差, 误导了别人就不好了.
|
|