ZhouXiangの博客 后端工程师&机器学习爱好者

ProtoBuff协议

2019-03-21

ProtoBuff协议简介。

Protubuf是什么

Protobuf是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于网络通信和数据存储。

Protubuf特点

Protubuf的优点

  • 平台无关,语言无关,可扩展;
  • 提供了友好的动态库,使用简单;
  • 解析速度快,比对应的XML快约20-100倍;
  • 序列化数据非常简洁、紧凑,与XML相比,其序列化之后的数据量约为1/3到1/10。

Protubuf的作用

  • 序列化:将数据结构或对象 转换成 二进制串 的过程
  • 反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程

Protubuf的应用场景

传输数据量大&网络环境不稳定的数据存储、RPC 数据交换的需求场景,例如即时IM(QQ/微信)。

Protubuf所在的网络层次

Protubuf属于TCP/IP模型的应用层&OSI模型的展示层。

Protubuf与Xml序列化反序列化过程对比

由于编码方式简单(只需要简单的数学运算 = 位移等等),以及采用Protubuf自身的框架代码和编译器共同完成,所以序列化、反序列化速度非常快。

Protubuf序列化

  • 判断每个字段是否有设置值,有值才进行编码
  • 根据字段标识号&数据类型,将字段值通过不同的编码方式进行编码

Protubuf反序列化

  • 调用消息类的parseFrom(input)解析从输入流读入的二进制字节数据流

Xml反序列化

  • 从文件中读取出字符串
  • 将字符串转换为 XML 文档对象结构模型
  • 从 XML 文档对象结构模型中读取指定节点的字符串
  • 将该字符串转换成指定类型的变量

上述过程非常复杂。其中,将XML文件转换为文档对象结构模型的过程通常需要完成词法文法分析等大量消耗CPU的复杂计算。

Protubuf为什么压缩效果好?

  • 采用了独特的编码方式,如Varint、Zigzag编码方式等等
  • 采用T-L-V的数据存储方式:减少了分隔符的使用 & 数据存储得紧凑

Protubuf与其他数据协议比较

Protubuf消息定义

消息由至少一个字段组合而成,类似于C语言中的结构。每个字段都有一定的格式。
字段格式:限定修饰符① | 数据类型② | 字段名称③ | = | 字段编码值④ | [字段默认值⑤]

Protubuf限定修饰符

  • 对于required的字段而言,初值是必须要提供的,否则字段的便是未初始化的。在Debug模式的buffer库下编译的话,序列化话的时候可能会失败,而且在反序列化的时候对于该字段的解析会总是失败的。所以,对于修饰符为required的字段,请在序列化的时候务必给予初始化。
  • 对于optional的字段而言,如果未进行初始化,那么一个默认值将赋予该字段,当然也可以指定默认值。
  • 对于repeated的字段而言,该字段可以重复多个,google提供的这个addressbook例子便有个很好的该修饰符的应用场景,即每个人可能有多个电话号码。在高级语言里面,我们可以通过数组来实现,而在proto定义文件中可以使用repeated来修饰,从而达到相同目的。当然,出现0次也是包含在内的。

Protubuf数据类型


Similar Posts

上一篇 Linux常见命令

Comments