一文搞懂XML、Json、Protobuf序列化协议

网络传输协议,简称为传送协议(Communications Protocol),是指计算机通信的共用语言。目前最为普遍的计算机通信为网络通信,因此“传送协议”一般是指计算机通信的传送协议,比如TCP/IP等。然而,传送协议也存在计算机的其他形式通信,例如:面向对象编程里面对象之间的通信;操作系统内不同进程之间的通信,都需要一个传送协议,以确保通信双方能够正常交流!常用的网络传输数据格式有:xml、json、protobuf等。

一、为什么需要序列化和反序列?

网络传输通常需要传输这样一个对象,里面的变量有些是数组的形式(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的解析方式有两种:

  1. 以文档模式进行解析,也就是通过父标签索引出一组标记。比如:xmlData.getElementsByTagName("tagName");
  2. 遍历及诶单(document以及childNodes),可以通过递归的方式。

三、Json、Protobuf简介

为了提供一种比xml更加轻量化的方式来进行系统间的通信,json和protobuf应运而生!

1、Json

Json是一种通用和轻量级的数据交换格式,也是以文本的结构进行存储,是一种简单的消息格式,全称为JavaScript Object Notation。Json作为数据包格式传输时具有更高的效率,这是因为Json不像xml那样需要有严格的闭合标签,这就让有效数据量与总数据包比有着显著的提升,从而减少同等数据流量的情况下网络的传输压力!

2、Protobuf

Protobuf是Google开发的一种独立和轻量级的数据交换格式,以二进制结构进行存储,用于不同服务之间序列化数据。全称为Protocol Buffers,是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者序列化,可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

Protobuf的原理:二进制数据流

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值