美文网首页我爱编程
进阶之路—序列化及反序列化二进制、Soap、XML篇

进阶之路—序列化及反序列化二进制、Soap、XML篇

作者: 李九lijiu | 来源:发表于2017-09-15 16:45 被阅读50次

    在编程中我们时常听到序列化和反序列化这两个词,但是对于一些刚入门的新手来讲,序列化和反序列化是什么东西,又不得而知,其实序列化和反序列化并没有我们相像的那么复杂和困难。举个例子:

    序列化反序列化图解

    上图应该很清晰了,假如我们在传输的过程中,想要把一个实体对象 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 格式的文件可读性要比另外两种好的太多了。

    相关文章

      网友评论

        本文标题:进阶之路—序列化及反序列化二进制、Soap、XML篇

        本文链接:https://www.haomeiwen.com/subject/gfudsxtx.html