Protobuf

是一种数据描述语言,一种紧凑的二进制消息格式,适合用于数据传输,数据存储。

消息长度:protobuf打包的数据不自带长度信息,需要应用程序自己在发送和接收消息的时候做切分

因此消息头部会有固定的长度的 headerLen 描述消息的长度

消息类型:不自带消息类型,需要由发送方把类型信息传给接收方,接收方再根据收到的消息类型创建具体的Message对象

Protobuf 具有消息类型自动反射的功能,可以根据 type name 创建相应类型的 Message 对象,当程序新增一个 protobuf msg 的时候,这部分代码不需要修改,不需要去注册消息类型

JSON 编码的不足

为了可读性牺牲了一定的性能(对象的内存分配大小不确定),没有描述类型,编码存在大量的冗余

pb 的优势

  • 事先定义好数据表项的类型:确定的内存有利于固定大小的快速一次性的内存分配
  • 传输消息单元名即 message 的名称而并非具体字段的名称(存储紧凑),客户端和服务端都会存储好这些数据表项的内容
  • 表项的存储会分配唯一的 typeID 来进行标记,双方都事先约定好 ID,进一步压缩存储

实际传输消息的数据

 ---------------------------------
|消息头:记录数据长度				  |
|---------------------------------|
|message 名称:用于查找对应的 msg 对象|
|---------------------------------|
|实际数据:二进制方式存储			  |
 ---------------------------------

proto 3 中的域会默认初始化为零值(类似Go的结构体),去除了 required 和 optional