Protocol Buffers 简介

Protocol Buffers 简介

十一月 23, 2019

What are protocol buffers?

Protocol buffers are Google’s language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then you can use special generated source code to easily write and read your structured data to and from a variety of data streams and using a variety of languages.

Protocol buffers 是Google的与语言无关,与平台无关,可扩展的机制,用于对结构化数据进行序列化(例如XML),但更小,更快,更简单。 您定义要一次构造数据的方式,然后可以使用生成的特殊源代码轻松地使用各种语言在各种数据流中写入和读取结构化数据。 – 来自谷歌翻译

个人理解是:

这是一个与平台、语言无关的,独立的数据结构。它具有可扩展性,并且具有更小的体积。但是他也需要生成与平台、语言对应的解析代码,以此来构造和解析数据。

特点

需要通过配置文件生成对应的源代码类才能使用

相比JsonXML来说,Protobuf为了压缩体积,导致它的数据不具备可读性,需要使用额外生成的解析器(与平台、语言匹配的数据类)才能对数据进行解析。
这样的结果,就造成了一个很大的负面问题:结构的固定化,因为改动数据结构,就会需要改变解析器的代码结构。
当然,Google 也提供了完整的插件,改变了结构之后,只需要重新一键生成就好了。

极致的体积压缩

Protobuf 的数据是以Byte数组的形式来保存。数据直接进行拼接,数据中不包含数据对应的key值,而是只记录数据的类型以及数据对应key的序号。这样就相比 Json 来说体积更加小了。
对于数字类型,更是以 VarInt 的形式来压缩长度:将数字转换为 Byte 倒序排列,当数字小于1个 Byte 时,可以只使用1个 Byte 来储存数据,将定长的数字变成了按需变长的数据。

自带混淆

这个特点是从设计特性衍生出来的。

  1. 不携带key的名称,截获的数据无法直接与业务对应。
  2. 数据直接编码成 Byte 数组,无法直接转换为文本展示。
  3. 尽管 Protobuf 内部也区分了类型,但是每个类型仍然代表了多种数据,同样的一组数据,可能存在多种解析方式,加大了解析难度。

使用

编码规则

解码方式