zoukankan      html  css  js  c++  java
  • 序列化之二(将"/Date(942289871000)/"格式的时间替换成"yyyy-MM-dd HH:mm:ss"格式)

    序列化就是一种用来处理对象流的机制。所谓对象流也就是将对象的内容进行流化,流的概念这里不用多说(就是I/O)。我们可以对流化后的对象进行读写

    操作,也可将流化后的对象传输于网络之间(注:要想将对象传输于网络必须进行流化)

    在对对象流进行读写操作时会引发一些问题,而序列化机制正是用来解决这些问题的

    如果没有序列化,那么对对象流进行读写操作会引发什么问题?

    1.运行时会报错的,类必须实现了Serializable接口,才能被序列化和反序列化,可以以流的形式存储//先知道这个吧。

    简单来说 序列化就是把Java对象储存在某一地方(硬盘、网络),以便于传输

    Person p = new Person();
     p.ID = 1;
     p.Name = "zhangsan";
     p.Birthday = new DateTime(1999, 11, 11, 11, 11, 11);
    Console.WriteLine("序列化前的对象:"+p.ToString());
    
    JavaScriptSerializer jss = new JavaScriptSerializer();
    string json = jss.Serialize(p);
    Console.WriteLine("序列化后的JSON字符串:" + json);
    Person p2 = jss.Deserialize<Person>(json);//再将序列化后的字符串还原到类型Person
    Console.WriteLine("反序列化的对象:"+p2.ToString()); 
    Console.ReadLine();
    序列化前的对象:ID:1;Name:zhangsan;Birthday:1999/11/11 11:11:11 
    序列化后的JSON字符串:{"ID":1,"Name":"zhangsan","Birthday":"/Date(942289871000)/"} 
    反序列化的对象:ID:1;Name:zhangsan;Birthday:1999/11/11 3:11:11

    从结果中可以看出如下几点问题:

    a、序列化前的日期和序列化后的日期不一样,并且相差恰好8小时。

    b、Json字符串的日期不是用"yyyy-MM-dd HH:mm:ss"格式表示的。

    问题分析

    1)Json字符串中的日期是怎么表示的?

    例如:"/Date(942289871000+0800)/",其中第一个数字表示自1970年1月1日午夜到指定日期的毫秒数;"+0800"部分可选,表示时区,默认为UTC。

    所以,可以看出,JavaScriptSerializer类将本地时间序列化成的UTC的Json时间字符串,导致反序列化的时间为UTC时间。

    在此,可以将反序列化后的时间转换成本地时间验证一下: Console.WriteLine(p2.Birthday.ToLocalTime()); 

    运行结果: 1999/11/11 11:11:11 

    解决方法

    1)将"/Date(942289871000)/"格式的时间替换成"yyyy-MM-dd HH:mm:ss"格式

    代码如下:

     /// <summary>
     /// JSON序列化和反序列化辅助类
     /// </summary>
     public class JsonHelper
     {
         /// <summary>
         /// 将Json格式的时间字符串替换为"yyyy-MM-dd HH:mm:ss"格式的字符串
         /// </summary>
         /// <param name="json"></param>
         /// <returns></returns>
         public static string ReplaceJsonDateToDateString(string json)
         {
             return Regex.Replace(json, @"\/Date((d+))\/", match => 14
             {
                 DateTime dt = new DateTime(1970, 1, 1);
                 dt = dt.AddMilliseconds(long.Parse(match.Groups[1].Value));
                 dt = dt.ToLocalTime();
                 return dt.ToString("yyyy-MM-dd HH:mm:ss");
             });
         }
     }
     Person p = new Person();
     p.ID = 1;
     p.Name = "zhangsan";
     p.Birthday = new DateTime(1999, 11, 11, 11, 11, 11);
     Console.WriteLine("序列化前的对象:" + p.ToString());
     JavaScriptSerializer jss = new JavaScriptSerializer();
     string json = jss.Serialize(p);
     Console.WriteLine("序列化后的JSON字符串:" + json);
     json = JsonHelper.ReplaceJsonDateToDateString(json);
     Console.WriteLine("替换后的JSON字符串:" + json);
     Person p2 = jss.Deserialize < Person > (json);
     Console.WriteLine("反序列化的对象:" + p2.ToString());
     Console.ReadLine();

    运行结果:

    序列化前的对象:ID:1;Name:zhangsan;Birthday:1999/11/1111:11:11
    序列化后的JSON字符串:{"ID":1,"Name":"zhangsan","Birthday":"/Date(942289871000)/"}
    替换后的JSON字符串:{"ID":1,"Name":"zhangsan","Birthday":"1999-11-11 11:11:11"}
    反序列化的对象:ID:1;Name:zhangsan;Birthday:1999/11/1111:11:11

     使用JsonConvert类进行序列化和反序列化

    需要引用Json.NET程序集。代码如下: 

     Person p = new Person();
     p.ID = 1;
     p.Name = "zhangsan";
     p.Birthday = new DateTime(1999, 11, 11, 11, 11, 11);
     Console.WriteLine("序列化前的对象:" + p.ToString());
     string json = JsonConvert.SerializeObject(p);
     Console.WriteLine("序列化后的JSON字符串:" + json);
     Person p2 = JsonConvert.DeserializeObject < Person > (json);
     Console.WriteLine("反序列化的对象:" + p2.ToString());
     Console.ReadLine();

    运行结果:

    原对象:ID:1;Name:zhangsan;Birthday:1999/11/11 11:11:11

    序列化后的JSON字符串:{"ID":1,"Name":"zhangsan","Birthday":"1999-11-11T11:11:11"}

    反序列化的对象:ID:1;Name:zhangsan;Birthday:1999/11/11 11:11:11

    JavaScriptSerializer不能对DataSet或DataTable进行D序列化 

    List < UsersModel > list = userbll.GetListModel(strwhere);
    JavaScriptSerializer js = new JavaScriptSerializer();
    string s = js.Serialize(list);
    context.Response.Write(s);
  • 相关阅读:
    使用JSON.NET实现对象属性的格式化的自定义
    AspNetCore项目-Service注入或覆盖
    发布Nuget
    收藏
    工具
    快捷键大全
    SqlServer分页查询语句
    面试相关
    Eratosthes algrithm 求素数
    code training
  • 原文地址:https://www.cnblogs.com/ZkbFighting/p/8138177.html
Copyright © 2011-2022 走看看