博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在 .NET 3.5 中序列化和反序列化 JSON
阅读量:7039 次
发布时间:2019-06-28

本文共 1994 字,大约阅读时间需要 6 分钟。

 
分类: 
 
905人阅读 
(0) 
 

 在 .NET 3.5 中,提供了一个新的类,用于 JSON 的序列化和反序列化。该类全称为:

System.Runtime.Serialization.Json.DataContractJsonSerializer

真长!要使用这个类,必须引入:

System.Runtime.Serialization

System.ServiceModel.Web

感觉有些高深莫测了,倒是挺符合微软一贯的风格。那就尽量写简单一点吧,首先从类定义开始:

 

[c-sharp] 
  1. // 必须使用属性 DataContract  
  2. [System.Runtime.Serialization.DataContract]  
  3. class Person  
  4. {  
  5.     // 对于要序列化的成员,须标注属性 DataMember     
  6.     [System.Runtime.Serialization.DataMember]  
  7.     private int Id { getset; }   
  8.     // 注意:看到 private 了吗?跟 XML 不一样,  
  9.     // 即使是 private,仍然能够正常序列化和反序列化   
  10.     [System.Runtime.Serialization.DataMember]  
  11.     public string Name { getset; }  
  12.     public Person(int id, string name)  
  13.     {  
  14.         Id = id;  
  15.         Name = name;  
  16.     }  
  17. }  

 

 

准备数据:

 

[c-sharp] 
  1. Person[] people = {  
  2.     new Person(1, "A"),  
  3.     new Person(2, "B"),  
  4.     new Person(3, "C"),  
  5.     new Person(4, "D"),  
  6.     new Person(5, "E")  
  7. }  

 

下面开始序列化,使用方法 WriteObject(Stream, Object):

 

[c-sharp] 
  1. DataContractJsonSerializer jsonFormator = new DataContractJsonSerializer(typeof(Person[]));  
  2. MemoryStream stream = new MemoryStream();  
  3. jsonFormator.WriteObject(stream, people);  
  4. string json = Encoding.UTF8.GetString(stream.ToArray());  
  5. stream.Close();  
  6. Console.WriteLine(json);  

 

 

挺郁闷的,为什么不提供一个 TextWrite 的流呢?这样就可以基于 StringBuilder 建一个 StringWrite 的流,直接写到 StringBuilder 里,免得这么七折八弯的。

试试另外一个重载 WriteObject(XmlWrite, Object):

 

[c-sharp] 
  1. DataContractJsonSerializer jsonFormator = new DataContractJsonSerializer(typeof(Person[]));  
  2. StringBuilder json = new StringBuilder();  
  3. System.Xml.XmlWriter xw = System.Xml.XmlWriter.Create(json);  
  4. jsonFormator.WriteObject(xw, people);  
  5. xw.Close();  
  6. Console.WriteLine(json.ToString());  

 

果然是一个 XML 文件,真不知道微软是怎么想的,我要序列化为一个 XML,用得着费这么大周折吗?况且,弄一个 XML 文件传到浏览器中,单解析这个 XML 文件让它正常显示在各种不同的浏览器上就是一项不小的工作。其实我想要的是一个简单的方法,如 WriteObject(Object),然后返回一个 JSON 格式的 string。看来只能自己再封装一下了。

下面看反序列化,接着 WriteObject(Stream, Object) 那一段程式继续往下写:

 

[c-sharp] 
  1. Stream readStream = new MemoryStream(Encoding.UTF8.GetBytes(json));  
  2. Person[] persons = jsonFormator.ReadObject(readStream) as Person[];  
  3. readStream.Close();  
  4. Console.WriteLine(persons.Length);  

 

 

反序列化倒还算是方便。呵呵,将就着用吧。

 

你可能感兴趣的文章
Mutual Funds引起的一桩桩血案
查看>>
zabbix如何监控nginx性能
查看>>
python3的异常处理
查看>>
linux C 动态共享库编译链接
查看>>
用jdbcTempate调用存储过程,处理BLOBCLOB小记
查看>>
oracle study road
查看>>
《你必须知道的495个C语言问题》笔记
查看>>
数据中心可靠级别划分
查看>>
你真的理解什么是“财富自由”吗?
查看>>
释放LINUX内存(请使用火狐浏览器浏览本页面)
查看>>
Andrew Ng 深度学习笔记-01-week3-课程
查看>>
Android获取通过XML设置的空间的高宽
查看>>
生活的苦逼
查看>>
在iptables防火墙下开启vsftpd的端口
查看>>
Mysql、MariaDB 新型主从集群配置GTID
查看>>
Linux HA Cluster的实例演示(2)
查看>>
Delphi之word报表
查看>>
unity的默认文件目录及脚本之间的执行顺序
查看>>
angular 定时函数
查看>>
移动端app测试关注点
查看>>