zoukankan      html  css  js  c++  java
  • 在 .NET 3.5 中序列化和反序列化 JSON Kevin

     
    分类: .NET 框架 905人阅读 评论(0) 收藏 举报

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

    System.Runtime.Serialization.Json.DataContractJsonSerializer

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

    System.Runtime.Serialization

    System.ServiceModel.Web

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

    [c-sharp] view plaincopy
    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] view plaincopy
    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] view plaincopy
    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] view plaincopy
    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] view plaincopy
    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);  

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

  • 相关阅读:
    HDU 1010 Tempter of the Bone(DFS剪枝)
    HDU 1013 Digital Roots(九余数定理)
    HDU 2680 Choose the best route(反向建图最短路)
    HDU 1596 find the safest road(最短路)
    HDU 2072 单词数
    HDU 3790 最短路径问题 (dijkstra)
    HDU 1018 Big Number
    HDU 1042 N!
    NYOJ 117 求逆序数 (树状数组)
    20.QT文本文件读写
  • 原文地址:https://www.cnblogs.com/kfx2007/p/2459491.html
Copyright © 2011-2022 走看看