开发者应当熟知的 C# 序列化和反序列化


开发者应当熟知的 C# 序列化和反序列化

文章插图
作者 | 喵叔
责编 | 刘静
出品 | CSDN(ID:CSDNnews)
今天我利用这篇文章给大家讲解一下 C# 中的序列化与反序列化 。这两个概念我们在开发中经常用到,但是我们绝大部分只用到了其中的一部分,剩下的部分很多开发人员并不清楚,伸着可以说是不知道 。因此我希望通过这篇文章能让各位对序列化和反序列化的知识有更进一步的掌握 。废话不多说开始进入正题 。
 
1.什么是序列化/反序列化在所有的开发语言中都存在序列化和反序列化这个概念,所谓的序列化就是把一个对象信息转化为一个可以持久存储的数据形式,经过转化后就可以方便的保存和传输了,因此序列化主要用于平台之间的通讯 。由序列化我们可以反推出所谓的反序列化就是将持久存储的数据还原为对象 。
 2.C# 中的序列化/反序列化在 C# 中我们经常会对 JSON 和 XML 进行序列化和反序列化,但是还有存在一种序列化/反序列化,那就是将对象序列化为二进制文件,将会二进制文件反序列化为对象 。下面我将会对这三种序列化和反序列化进行讲解 。
1. JSON
JSON 的英文全称是 JAVAScript Object Notation,是一种轻量级的数据交换格式 。完全独立于语言的文本格式 易于人阅读和编写同时也易于机器解析和生成 。JSON 是目前互联网中主流的数据交换格式,同时也是很多开发语言配置文件的主流格式 。
在 .NET 中存在两个类对 JSON 进行处理,分别是 DataContractJsonSerializer 和 JavaScriptSerializer,这两个类的功能基本一致 。DataContractJsonSerializer 位于命名空间 System.Runtime.Serialization.Json 下,它的特点是必须使用 DataContract 以及 DataMember 属性标记成员 。JavaScriptSerializer 位于命名空间 System.Web.Script.Serialization 下,通过名字和它所在的命名空间我们可以得知它主要用在网络通信中,它可以序列化任何类型的对象 。同样 .NET 中也存在一个强大的第三方 JSON 序列化/反序列化库 Newtonsoft.Json,他比前两个类用起来要方便很多 。下面我们对这三个序列化/反序列化的方式分别进行讲解 。
  • DataContractJsonSerializer
首先我们需要在项目中引用 DataContractJsonSerializer 所在的命名空间,这里要注意的时我们不仅要在项目中添加引用 System.Runtime.Serialization 还需要添加引用 System.ServiceModel.Web。将这两个命名空添加到命名空间后就可以在代码中引入 DataContractJsonSerializer 的命名空间了 。
using System.Runtime.Serialization;using System.Runtime.Serialization.Json;引入命名空间后我们开始编写序列化类
[DataContract]class Student{[DataMember]public string Name { get; set; }[DataMember]public int Sex { get; set; }[DataMember]public int Age { get; set; }[DataMember]public Address Address { get; set; }}[DataContract]class Address{[DataMember]public string City { get; set; }[DataMember]public string Road { get; set; }}在上述代码中我们看到在类的头部添加了 DataContract 特性,以及在类的属性上也增加了 DataMember 特性。一旦一个类被声明为 DataContract 时就代表着该类可以被序列化,并且可以在服务端和客户端传输 。只有声明为DataContract的类型的对象可以被传送,且只有成员属性会被传递,成员方法不会被传递 。默认情况下类中的所有成员属性都不会被序列化传输出去,如果需要将成员数据传输出去就需要在属性头部加入 DataMember。
下面我们就利用 DataContractJsonSerializer 对对象尽心序列化和反序列化,代码如下
class Program{static void Main(string[] args){#region 对象转JSON字符串Student student = new Student{Name = "Tom",Age = 20,Sex = 1,Address = new Address{City = "NYC",Road = "ABC"}};//利用WriteObject方法序列化为 JSONDataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Student));MemoryStream stream = new MemoryStream;serializer.WriteObject(stream, student);byte bytes=new byte[stream.Length];stream.Position = 0;stream.Read(bytes, 0, (int)stream.Length);string jsonStr = Encoding.UTF8.GetString(bytes);Console.WriteLine(jsonStr);#endregion#region JSON字符串转对象stream = new MemoryStream(Encoding.Default.GetBytes(jsonStr));student = (Student)serializer.ReadObject(stream);Console.WriteLine("Name: " +student.Name);Console.WriteLine("Sex: " + student.Sex);Console.WriteLine("Age: " + student.Age);Console.WriteLine("Address: " + student.Address.City+" "+student.Address.Road);#endregionConsole.ReadLine;}}


推荐阅读