.Net——使用DataContractJsonSerializer进行序列化及反序列化基本操作



        在平常中,我们经常会用到将一个T类型的东西,序列化成Json然后返回绑定数据到页面这样一个过程。每次面试,大概都被问到怎么序列化的呀?回答总是底层封装好的,算啦,还是做个简单栗子玩玩儿吧,也好堵住面试官的嘴。



        进行序列化和反序列化的时候,主要用到对象DataContractJsonSerializer,然后再配合MemoryStream,就ok啦。


        不多说,先来一版简单的+泛型的栗子,之后,我们会逐步改进:



       

[csharp]  view plain copy
  1. public static class JsonConvert  
  2.   {  
  3.       /// <summary>  
  4.       /// Converts the obj to json.  
  5.       /// </summary>  
  6.       /// <typeparam name="T"></typeparam>  
  7.       /// <param name="t">The t.</param>  
  8.       /// <returns>System.String.</returns>  
  9.       /// <remarks>Editor:v-liuhch CreateTime:2015/6/21 21:40:55</remarks>  
  10.       public static string ConvertObjToJson<T>(T t)  
  11.       {  
  12.           DataContractJsonSerializer ser = new DataContractJsonSerializer(t.GetType());  
  13.   
  14.           try   
  15.        {              
  16.     using (MemoryStream ms=new MemoryStream())  
  17.                   {  
  18.                       ser.WriteObject(ms,t);  
  19.                       string strJson=Encoding.UTF8.GetString(ms.ToArray());  
  20.                       return strJson;  
  21.                    }  
  22.   
  23.        }  
  24.        catch (IOException)  
  25.        {  
  26.                    //自己处理异常吧  
  27.         return null;  
  28.        }  
  29.             
  30.         
  31.       }  
  32.   
  33.       /// <summary>  
  34.       /// Jsons the deserialize.  
  35.       /// </summary>  
  36.       /// <typeparam name="T"></typeparam>  
  37.       /// <param name="strJson">The STR json.</param>  
  38.       /// <returns>``0.</returns>  
  39.       /// <remarks>Editor:v-liuhch CreateTime:2015/6/21 21:46:37</remarks>  
  40.       public static T JsonDeserialize<T>(string strJson)  
  41.           where T:class //约束T为class,也可以放宽类型,这里只是个例子,写着玩儿的,欧巴们,此处可改  
  42.       {  
  43.   
  44.           DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));  
  45.   
  46.           try  
  47.           {  
  48.               using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(strJson)))  
  49.               {  
  50.                   T obj = ser.ReadObject(ms) as T;  
  51.                   return obj;  
  52.               }  
  53.           }  
  54.           catch (IOException e)  
  55.           {  
  56.               //自己处理异常吧  
  57.               return null;  
  58.           }  
  59.            
  60.       }  
  61.   }  



     然后我们写个类测试下:


    

[csharp]  view plain copy
  1. //[Serializable]  
  2.    public  class Student  
  3.     {  
  4.        public string StudentId { getset; }  
  5.        public string Name { getset; }  
  6.        public int age { getset; }  
  7.        public string Address { getset; }  
  8.     }  


测试代码:



     

[csharp]  view plain copy
  1. protected void Page_Load(object sender, EventArgs e)  
  2.       {  
  3.           Student student = new Student()  
  4.           {  
  5.   
  6.               StudentId = "110",  
  7.               Name = "水田如雅",  
  8.               age = 20,  
  9.               Address = "北京朝阳区"  
  10.           };  
  11.  
  12.           #region 序列化测试  
  13.               string strStudentJson = JsonConvert.ConvertObjToJson<Student>(student);  
  14.               Response.Write(strStudentJson);  
  15.                
  16.           #endregion  
  17.  
  18.           #region 反序列化测试  
  19.               //{"Address":"北京朝阳区","Name":"水田如雅","StudentId":"110","age":20}  
  20.               string strJson = "{\"Address\":\"北京朝阳区\",\"Name\":\"水田如雅\",\"StudentId\":\"110\",\"age\":20}";  
  21.               Student newStudent = JsonConvert.JsonDeserialize<Student>(strJson);  
  22.   
  23.               Response.Write(@"<br/><br/>" + newStudent.Address + "<br/>" + newStudent.Name + "<br/>" + newStudent.StudentId + "<br/>" + newStudent.age.ToString());  
  24.  
  25.  
  26.  
  27.           #endregion  
  28.   
  29.       }  


围观下结果:



      不知亲你又没有注意到,以前我们可以序列化的对象都是要打上[Serializable]这一特性的,但是在student类上我却注掉了它,why? 自己写一个运行下看看会发生啥吧,原因也不解释,请参考百度大学。微懒的童鞋可以坐等楼主心情好了更新blog!另外,本例中只是对简单类型进行了序列化,复杂情况未进行考虑,楼主会看心情再更blog的。see u~



 ----------------------------------------------------------第二天--------------------------------------------


补上答案:

https://msdn.microsoft.com/zh-cn/library/bb412179.aspx


        在平常中,我们经常会用到将一个T类型的东西,序列化成Json然后返回绑定数据到页面这样一个过程。每次面试,大概都被问到怎么序列化的呀?回答总是底层封装好的,算啦,还是做个简单栗子玩玩儿吧,也好堵住面试官的嘴。



        进行序列化和反序列化的时候,主要用到对象DataContractJsonSerializer,然后再配合MemoryStream,就ok啦。


        不多说,先来一版简单的+泛型的栗子,之后,我们会逐步改进:



       

[csharp]  view plain copy
  1. public static class JsonConvert  
  2.   {  
  3.       /// <summary>  
  4.       /// Converts the obj to json.  
  5.       /// </summary>  
  6.       /// <typeparam name="T"></typeparam>  
  7.       /// <param name="t">The t.</param>  
  8.       /// <returns>System.String.</returns>  
  9.       /// <remarks>Editor:v-liuhch CreateTime:2015/6/21 21:40:55</remarks>  
  10.       public static string ConvertObjToJson<T>(T t)  
  11.       {  
  12.           DataContractJsonSerializer ser = new DataContractJsonSerializer(t.GetType());  
  13.   
  14.           try   
  15.        {              
  16.     using (MemoryStream ms=new MemoryStream())  
  17.                   {  
  18.                       ser.WriteObject(ms,t);  
  19.                       string strJson=Encoding.UTF8.GetString(ms.ToArray());  
  20.                       return strJson;  
  21.                    }  
  22.   
  23.        }  
  24.        catch (IOException)  
  25.        {  
  26.                    //自己处理异常吧  
  27.         return null;  
  28.        }  
  29.             
  30.         
  31.       }  
  32.   
  33.       /// <summary>  
  34.       /// Jsons the deserialize.  
  35.       /// </summary>  
  36.       /// <typeparam name="T"></typeparam>  
  37.       /// <param name="strJson">The STR json.</param>  
  38.       /// <returns>``0.</returns>  
  39.       /// <remarks>Editor:v-liuhch CreateTime:2015/6/21 21:46:37</remarks>  
  40.       public static T JsonDeserialize<T>(string strJson)  
  41.           where T:class //约束T为class,也可以放宽类型,这里只是个例子,写着玩儿的,欧巴们,此处可改  
  42.       {  
  43.   
  44.           DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));  
  45.   
  46.           try  
  47.           {  
  48.               using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(strJson)))  
  49.               {  
  50.                   T obj = ser.ReadObject(ms) as T;  
  51.                   return obj;  
  52.               }  
  53.           }  
  54.           catch (IOException e)  
  55.           {  
  56.               //自己处理异常吧  
  57.               return null;  
  58.           }  
  59.            
  60.       }  
  61.   }  



     然后我们写个类测试下:


    

[csharp]  view plain copy
  1. //[Serializable]  
  2.    public  class Student  
  3.     {  
  4.        public string StudentId { getset; }  
  5.        public string Name { getset; }  
  6.        public int age { getset; }  
  7.        public string Address { getset; }  
  8.     }  


测试代码:



     

[csharp]  view plain copy
  1. protected void Page_Load(object sender, EventArgs e)  
  2.       {  
  3.           Student student = new Student()  
  4.           {  
  5.   
  6.               StudentId = "110",  
  7.               Name = "水田如雅",  
  8.               age = 20,  
  9.               Address = "北京朝阳区"  
  10.           };  
  11.  
  12.           #region 序列化测试  
  13.               string strStudentJson = JsonConvert.ConvertObjToJson<Student>(student);  
  14.               Response.Write(strStudentJson);  
  15.                
  16.           #endregion  
  17.  
  18.           #region 反序列化测试  
  19.               //{"Address":"北京朝阳区","Name":"水田如雅","StudentId":"110","age":20}  
  20.               string strJson = "{\"Address\":\"北京朝阳区\",\"Name\":\"水田如雅\",\"StudentId\":\"110\",\"age\":20}";  
  21.               Student newStudent = JsonConvert.JsonDeserialize<Student>(strJson);  
  22.   
  23.               Response.Write(@"<br/><br/>" + newStudent.Address + "<br/>" + newStudent.Name + "<br/>" + newStudent.StudentId + "<br/>" + newStudent.age.ToString());  
  24.  
  25.  
  26.  
  27.           #endregion  
  28.   
  29.       }  


围观下结果:



      不知亲你又没有注意到,以前我们可以序列化的对象都是要打上[Serializable]这一特性的,但是在student类上我却注掉了它,why? 自己写一个运行下看看会发生啥吧,原因也不解释,请参考百度大学。微懒的童鞋可以坐等楼主心情好了更新blog!另外,本例中只是对简单类型进行了序列化,复杂情况未进行考虑,楼主会看心情再更blog的。see u~



 ----------------------------------------------------------第二天--------------------------------------------


补上答案:

https://msdn.microsoft.com/zh-cn/library/bb412179.aspx


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值