网络传输协议,简称为传送协议(Communications Protocol),是指计算机通信的共用语言。目前最为普遍的计算机通信为网络通信,因此“传送协议”一般是指计算机通信的传送协议,比如TCP/IP等。然而,传送协议也存在计算机的其他形式通信,例如:面向对象编程里面对象之间的通信;操作系统内不同进程之间的通信,都需要一个传送协议,以确保通信双方能够正常交流!常用的网络传输数据格式有:xml、json、protobuf等。
一、为什么需要序列化和反序列?
name | 姓名,如:Mike |
age | 年龄,如:34 |
languages | 熟悉的编程语言,如:C++、JAVA、Go,数组格式,如:["C++","Linux"] |
phone | 电话号码,是嵌套的对象,包含number和type,如:"number":"18337627326","type":"home" |
books | 对象数组方式,可以包含多本书信息,每本书包含name和price属性 |
vip | 是否为vip会员,如:true,false |
address | 地址,如:"广东省深圳市" |
网络传输通常需要传输这样一个对象,里面的变量有些是数组的形式(language),有些可能是对象(phone),甚至有些是数组对象(books)。
此时我们需要将对象从客户端传输到服务器,那应该怎么传输呢?定义一个person对象,在描述完成员变量,将这个对象占用的内存发送给服务器?比如:
//Client伪代码
Person per;
封装per;
send(fd,&per,sizeof(per));
//Server伪代码
recv(sockfd,buf,1024);
我们知道所定义的苏家结构对于计算机来说都是二进制的字节而已,在网络传输的过程也是以字节流形式进程传输。Linux系统中,在send函数per被强制转换为void*,第二个参数类型为const void*,在recv函数中获取buf,并且强制转换为Person类型,最终得到想要的结果。这里面涉及到将per对象转换为void*,是发送前的序列化操作;将接收到的buf转换为Person类型是反序列化操作。
这样子行不行?
答案是:肯定不行了!比如language可能是“c++”,也可能是“Go”,此时我们sizeof(per)是固定还是不固定?假如不固定,那服务器怎么解析出一个Person类来?
既然不能直接传输对象,那怎么办?这时候序列化协议就发挥作用了。
二、序列化和反序列化基础
1、序列化和反序列的概念
- 序列化:将对象转换为字节序列的过程称为对象的序列化;
- 反序列化:将字节序列恢复为对象的过程称为对象的反序列化;
2、什么情况下序列化?
- 当你想要把内存中的对象状态保存到一个文件中或者数据库中的时候;
- 当你想要用套接字在网络上传送对象的时候;
3、如何实现序列化?
主流序列化协议:xml、json、protobuf
4、xml/json/protobuf序列化结果
(1)xml序列化结果
(2)json序列化结果
(3)protobuf序列化结果
三、XML简介
xml是一种通用和轻量级的数据交换格式语言,是指可扩展标记语言(extensible markup language),以文本结构进行存储。它可以用来标记数据、定义数据类型,提供统一的方法来描述和交换,而且独立于程序语言或供应商的结构化数据。xml有丰富的编码工具,比如DOM、SAX等。xml的解析方式有两种:
- 以文档模式进行解析,也就是通过父标签索引出一组标记。比如:xmlData.getElementsByTagName("tagName");
- 遍历及诶单(document以及childNodes),可以通过递归的方式。
优点 | (1)文本结构存储; |
缺点 | (1)xml格式存储的数据比其它的占用更多的空间,因为它除了保存原始数据,还需要保存元数据的描述; (2)格式转换问题,比如给定一个doc做数据交互,需要先确定doc怎么编码,才可以用xml描述并还原; |
三、Json、Protobuf简介
为了提供一种比xml更加轻量化的方式来进行系统间的通信,json和protobuf应运而生!
1、Json
Json是一种通用和轻量级的数据交换格式,也是以文本的结构进行存储,是一种简单的消息格式,全称为JavaScript Object Notation。Json作为数据包格式传输时具有更高的效率,这是因为Json不像xml那样需要有严格的闭合标签,这就让有效数据量与总数据包比有着显著的提升,从而减少同等数据流量的情况下网络的传输压力!
2、Protobuf
Protobuf是Google开发的一种独立和轻量级的数据交换格式,以二进制结构进行存储,用于不同服务之间序列化数据。全称为Protocol Buffers,是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者序列化,可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。
Protobuf的原理:二进制数据流
优点 | (1)二进制结构存储,效率高,序列化体积比Json和xml更小、更加灵活; (2)格式规范,支持RPC; (3)易于使用,开发人员可以按照一定的语法定义结构化的消息格式,然后送给命令行工具,工具将自动生成相关的类,可以支持JAVA、C++、Go等语言环境。通过这类类包含在项目当中,可以很轻松的调用相关方法来完成业务消息的序列化与反序列工作; |
缺点 | (1)可读性不高; |