golang数据传输格式-序列化与反序列化

版权声明:原创作品,谢绝转载!否则将追究法律责任。

  想必计算机专业毕业的小伙伴应该都知道数据想要持久化存储,必须将其存在I/O设备里面,这些I/O设备可以是光盘,U盘,机械硬盘,移动硬盘等等。那么这些数据是以哪种方式进程存取的呢?这就是我们聊的数据传输格式。

  数据格式(data format)是描述数据保存在文件或记录中的规则。可以是字符形式的文本格式,或二进制数据形式的压缩格式。字符形式的文本格式占用的存贮空间多但透明度高,二进制数形式的压缩格式占用的存贮空间少但缺少透明度。数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。

  数据结构往往同高效的检索算法和索引技术有关。[1] 数据结构要在网络中传输或保存到文件,就必须对其编码和解码;目前存在很多编码格式:JSON,XML,gob,Google 缓冲协议等等。Go 语言支持所有这些编码格式。不过本篇博客将讨论前三种格式。

  

一.XML

  XML作为一种数据交换和信息传递的格式已经十分普及。而随着 Web服务日益广泛的应用,现在XML在日常的开发工作中也扮演了愈发重要的角色。如同 json 包一样,也有 Marshal() 和 UnMarshal() 从 XML 中编码和解码数据;但这个更通用,可以从文件中读取和写入(或者任何实现了 io.Reader 和 io.Writer 接口的类型)和 JSON 的方式一样,XML 数据可以序列化为结构,或者从结构反序列化为 XML 数据;

  接下来我们将对“yinzhengjie.xml”文件进行反序列化,其文件内容如下:

1.Xml数据格式的反序列化

2.Xml数据格式的序列化

  执行以上代码之后,会生成一个新的文件,即“yinzhengjie.xml.bak”文件。其内容如下:

  更多关于学习XML知识的话,我推荐两个学习的网站给大家:

      a>.http://www.xml.org/

      b>.http://www.w3school.com.cn/xml/

二.JSON

  JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。人类阅读和写作很容易。机器解析和生成很容易。它基于JavaScript编程语言的一个子集 , 标准ECMA-262第3版 - 1999年12月。JSON是完全独立于语言的文本格式,但是使用C语言家族的程序员熟悉的约定,包括C,C ++,C#,Java,JavaScript,Perl,Python等等。这些属性使JSON成为理想的数据交换语言。

1.Json数据格式的序列化

  在golang语言中,我们用json.Marshal() 进行序列化。json.Marshal() 的函数签名是 func Marshal(v interface{}) ([]byte, error)。出于安全考虑,在 web 应用中最好使用 json.MarshalforHTML() 函数,其对数据执行HTML转码,所以文本可以被安全地嵌在 HTML <script> 标签中。序列化是在内存中把数据转换成指定格式(data -> string),反之亦然(string -> data structure)编码也是一样的,只是输出一个数据流(实现了 io.Writer 接口);解码是从一个数据流(实现了io.Reader)输出到一个数据结构。

  JSON 与 Go 类型对应如下:

    a>.bool 对应 JSON 的 booleans;
    b>.float64 对应 JSON 的 numbers;
      c>.string 对应 JSON 的 strings;
      d>.nil 对应 JSON 的 null;

  不是所有的数据都可以编码为 JSON 类型:只有验证通过的数据结构才能被编码:
    a>.JSON 对象只支持字符串类型的 key;要编码一个 Go map 类型,map 必须是 map[string]T(T是json 包中支持的任何类型);
    b>.Channel,复杂类型和函数类型不能被编码;
    c>.不支持循环数据结构;它将引起序列化进入一个无限循环;
    d>.指针可以被编码,实际上是对指针指向的值进行编码(或者指针是 nil);

  Go 语言的 json 包可以让你在程序中方便的读取和写入 JSON 数据。接下来我们一起看一下golang是如何使用json包的:

2.Json数据格式的反序列化    

  如果我们事先知道 JSON 数据,我们可以定义一个适当的结构并对 JSON 数据反序列化。我们上面做序列化的时候创建了一个“yinzhengjie.json”的文件,里面的数据结果我们是心知肚明的,因此,接下来反序列化就是一件很Easy的事情啦。

  更多关于学习XML知识的话,我推荐两个学习的网站给大家:

      a>.http://www.json.org/

      b>.http://www.w3school.com.cn/json/

三.Gob

  Gob 是 Go 自己的以二进制形式序列化和反序列化程序数据的格式;可以在 encoding 包中找到。这种格式的数据简称为 Gob (即 Go binary 的缩写)。类似于 Python 的 "pickle" 和 Java 的"Serialization"。

  Gob 通常用于远程方法调用参数和结果的传输,以及应用程序和机器之间的数据传输。 它和 JSON 或 XML 有什么不同呢?Gob 特定地用于纯 Go 的环境中,例如,两个用 Go 写的服务之间的通信。这样的话服务可以被实现得更加高效和优化。 Gob 不是可外部定义,语言无关的编码方式。因此它的首选格式是二进制,而不是像 JSON 和 XML 那样的文本格式。 Gob 并不是一种不同于Go 的语言,而是在编码和解码过程中用到了 Go 的反射。

  Gob 文件或流是完全自描述的:里面包含的所有类型都有一个对应的描述,并且总是可以用 Go 解码,而不需要了解文件的内容。

  只有可导出的字段会被编码,零值会被忽略。在解码结构体的时候,只有同时匹配名称和可兼容类型的字段才会被解码。当源数据类型增加新字段后,Gob 解码客户端仍然可以以这种方式正常工作:解码客户端会继续识别以前存在的字段。并且还提供了很大的灵活性,比如在发送者看来,整数被编码成没有固定长度的可变长度,而忽略具体的 Go 类型。

  Golang的解码和编码就相对简单啦,就我个人而言,我对golang专有的gob格式还是那么的情有独钟。它的使用方法很简单,我们可以一起看一下它的解码和编码的过程,具体代码 如下:

1.Gob的编码(序列化)

  执行以上代码之后会生成一个“yinzhengjie.gob”文件,这个文件的内容是二进制编码的,因此我们用gbk编码或是utf-8编码格式直接去打开的话可能不是很理想。因此我们可以通过gob的反序列化来进行读取操作,具体代码请参考以下代码。

2.Gob的解码(反序列化)

四.数据传输进阶知识-golang中的密码学

通过网络传输的数据必须加密,以防止被 hacker(黑客)读取或篡改,并且保证发出的数据和收到的数据检验和一致。 鉴于 Go 母公司的业务,我们毫不惊讶地看到 Go 的标准库为该领域提供了超过 30 个包:

  1>.hash 包:实现了 adler32 、 crc32 、 crc64 和 fnv 校验;

  2>.crypto 包:实现了其它的 hash 算法,比如 md4 、 md5 、 sha1 等。以及完整地实现了 aes 、blowfish 、 rc4 、 rsa 、 xtea 等加密算法。