关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
讲这个序列化和反序列化模拟两个场景,帮助理解一下他们是什么鬼。理解之后,才方便说如何实现。
场景1:游戏存档和读档
当你在玩一个游戏正High的时候,突然有事找你。那你不得不需要存个档,等下次回来再接着玩。
此处的存档操作是把游戏中已经实例化的对象(场景、人物等)以字符串或二进制数组保存到文件中。这个叫序列化;
等读档的时候,再把保存到文件中的数据读取加载程序中,变成对应的对象(场景和人物等)。这个就是反序列化。
场景2:网络数据传递
你和你们公司的同事在用同一款软件。你有个数据包需要丢给你同事。这时丢过去的过程中,就实现了序列化:把你的数据或对象序列化成二进制。
这个数据包再通过网络传递到你同事的电脑上,再解读显示。这个解读过程,实现了反序列化:把你的数据包解析成对应的数据或对象。
看完上面两个模拟的场景,知道序列化和反序列化的含义和作用了吗。总结如下:
序列化:实例化对象 --> 字符串/二进制数组
反序列化:字符串/二进制数组 --> 实例化对象
序列化和反序列化的实现:
1、在你的类或结构上添加[Serializable]标识,表示该类可以序列化
[Serializable] public class MyClass { //属性 public string Name {get;set;} //构造函数 public MyClass(string name) { this.Name = name; } }
我们用于测试的类比较简单,就1个字段。
2、序列化和反序列化的实现,很多人习惯单独写一个类来处理。我习惯写到这个类里面:
using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; [Serializable] public class MyClass { //属性 public string Name {get;set;} //构造函数 public MyClass(string name) { this.Name = name; } //序列化成byte数组 public byte[] Serialize() { MemoryStream stream = new MemoryStream(); IFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, this); byte[] serializedData = stream.ToArray(); stream.Close(); return serializedData; } //序列化成字符串 public string SerializeString() { return Convert.ToBase64String(this.Serialize()); } //反序列化 public static MyClass Deserialize(byte[] data) { using (MemoryStream stream = new MemoryStream(data)) { IFormatter formatter = new BinaryFormatter(); return (MyClass)formatter.Deserialize(stream); } } //反序列化 public static MyClass Deserialize(string dataString) { byte[] data = Convert.FromBase64String(dataString); return MyClass.Deserialize(data); } }
其中,利用BinaryFormatter实现序列化和反序列化。
3、测试
创建一个控制台程序,新建一个MyClass类,把上面的代码粘贴进去。测试代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { MyClass myClass = new MyClass("Tom"); Console.WriteLine("序列化之前的名字:" + myClass.Name); //序列化 string dataString = myClass.SerializeString(); Console.WriteLine(dataString); //反序列化 MyClass newClass = MyClass.Deserialize(dataString); Console.WriteLine("反序列化之后:" + newClass.Name); Console.ReadKey(); } } }
执行代码,可以看到序列化之后的内容。已经反序列化之后,还是可以得到原来的内容。