关于本站
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();
}
}
}执行代码,可以看到序列化之后的内容。已经反序列化之后,还是可以得到原来的内容。
