在编程中我们时常听到序列化和反序列化这两个词,但是对于一些刚入门的新手来讲,序列化和反序列化是什么东西,又不得而知,其实序列化和反序列化并没有我们相像的那么复杂和困难。举个例子:
序列化反序列化图解上图应该很清晰了,假如我们在传输的过程中,想要把一个实体对象 A 传给 b 这台机器,但是传送的管道过小,没办法将 A整体传过去,那么我们先将 A 打碎,然后传过去之后在进行重组,打碎的过程就叫做序列化,重组的过程就叫做反序列化。
序列化和反序列化在 C# 中可以通过多种方式实现,格式不同,生成的文件大小也各不相同,当前比较流行的格式有以下几种:Soap, XML , Json , 二进制。接下来我们就一起探究一下以上几种格式序列化的方法以及优劣性。
首先是二进序列化的方式:对象序列化之后是二进制格式的,通过 BinaryFormatter 类实现,该类位于 System.Runtime.Serialization.Formatters.Binary 命名空间下。
我们新建一个空的解决方案,在解决方案中分别填加以下控制台程序:BinarySerialize ,JsonSerialize ,SoapSerialize ,XmlSerialize 以及 Model 类库。
程序目录首先进行 Model 中实体对象的创建:
实体对象创建需要注意,想要使用序列化器对这个类生成的对象序列化,需要在这个类上标识一个特性 [ Serializable ]
[ Serializable ]:表示标识的类是可以被序列化的。
接下来在 BinarySerialize 控制台程序下,我们添加以下代码:
二进制序列化反序列化的代码以上代码中,我们通过读写流的方式,在电脑D盘创建了一个文件,并将序列化之后的对象传入到该文件中去,之后又将文件中的二进制内容取出反序列化成一个对象实体。
生成的文件和序列化后的二进制片段我们可以看到,这样序列化就成功了,因为是二进制的格式,所以很难读懂。
反序列化生成的实体对象而接下来的反序列化也没有让我们失望,成功的将文件流中的二进制片段转换成了实体对象。
Soap 序列化器进行序列化:对象序列化之后的结果符合 Soap 协议,也就是可以通过 Soap 协议传输,通过 System.Runtime.Serialization.Formatters.Soap 命名空间下的 SoapFormatte r类来实现的。
以下是 Soap 序列化的后台代码:
可以看出,跟二进制的代码基本是一样的,区别在于调用的序列化器不同并且需要注意的是 Soap 序列化器不支持序列化泛型所以要在实体对象后后面 toArray() 一下,将其装换成数组。接下来我们运行试一试。
生成的文件以及soap片段 反序列化出来的对象上面两张图证明我们已经成功的序列化以及反序列化除了这个对象,而生成的文件打开之后我们发现,虽然不好阅读,但是也能找到我们需要的数据。
XML序列化:对象序列化之后的结果是 XML形式的,通过 XmlSerializer 类来实现的,该类位于 System.Xml.Serialization 命名空间下。XML序列化不能序列化私有数据。
xml序列化的后台代码上面 XML 序列化的代码与二进制和 Soap 的相差不大,除了序列化器名称不一样之外还需注意的是, XML 序列化器在创建的时候需要给其指定对象类型。
序列化成功创建的文件 反序列化后的对象上面两张图证明了我们代码是可以成功运行的,而且 XML 格式的文件可读性要比另外两种好的太多了。
网友评论