1.1 protobuf概述

Protocol Buffers(简称:ProtoBuf)是由Google开发的一款支持跨平台使用的序列化数据结构协议。

应用该协议库可以对客户自定义的数据结构内容进行二进制转换与反向恢复,且会对基于数据体积以及性能的优化。用户可以不关注转换及优化本身,只需要关注数据及数据结构即可。

画板

Google最初开发其在内部使用,并被广泛应用在数据存储和数据交换的场景中,大量的Google内部跨服务器的通信应用中,都可以见到protobuf的身影。

Protobuf于2008年7月初版发布,至今(2023年11月29日)已迭代146次(数据来源github release),最新版本为25.1。

1.2 项目地址

Protobuf项目代码发布在github仓库中,可以在此查看并且下载最新的protobuf代码,或查看其版本迭代情况。

GitHub - protocolbuffers/protobuf: Protocol Buffers - Google’s data interchange format

Protobuf官网展示了其说明文档,文档中对Protobuf的使用方法和细节做了详尽的描述。

Protocol Buffers

1.3 protobuf的优势与缺点

1.3.1 protobuf的优势

  • 效率高,数据体积小:序列化后生成的二进制数据占用空间更小,序列化/反序列化时间更短,效率更高。(对比于xml、json,具体对比数据可见参考文章:json、xml、protobuf性能对比_protobuf和json区别-CSDN博客
  • 扩展兼容性强:按照一定的编码规则对协议进行扩充,可实现对原有结构格式、数据的兼容,大大降低了数据内容扩充的工作量,提高了解析兼容性。
  • 生成代码调用便捷:protobuf编译器可便捷的生成对应协议的应用class,便于代码直接调用对数据进行解析与分析。
  • 跨语言支持:支持多种编程语言,使跨平台、跨应用的数据传递与解析更加便捷,仅需共同维护同一套协议文件(.proto)。

1.3.2 protobuf的缺点

  • 自解释性差:相较于xml、json的明码存储方式,使用protobuf协议生成的数据存储为二进制存储的方式,因此无法通过对二进制文件的读取直接了解数据结构信息,必须要通过对应的协议文件proto解析才能获取实际数据定义。

1.4 protobuf的应用场景

  • 网络数据通信:利用protobuf效率高,数据体积小的特点,将待传输数据通过protobuf序列化后进行网络传输,并在数据接收端进行反序列化,缩减数据传输对数据量及带宽的占用,适用于传输性能要求较高或带宽有限的网络数据通信场景。
  • 数据存储与传输:利用protobuf效率高,数据体积小的特点,对数据进行序列化后存储及传输,降低空间占用体积。使用时通过进行反序列化对数据进行恢复。
  • API接口定义:利用protobuf跨语言支持的特点,可以利用提前定义的proto数据结构在不同语言间进行消息的传递,便于不同语言及功能应用间进行消息的通信。

1.5 protobuf的应用方法

在使用protobuf对数据进行转换前,需要先按照数据的格式、类型、数据结构来编写对应的.proto文件,在文件中我们可以通过定义消息结构(message)、枚举(enum)、数据重复(repeated)等多种方式来定义描述proto数据类型。

在编写定义好.proto格式文件后,我们需要通过脚本的方式将该文件转换为对应的代码文件(如C++生成对应的.cc/.h类文件,python生成.py文件)便于使用程序逻辑进行数据处理中调用。

protobuf对数据生成二进制数据存储的过程称为序列化,即将原始数据转换为proto处理的二进制数据文件的过程。对将proto生成的二进制数据文件转换为常规格式的数据类型的过程称反序列化。

1.6 proto2与proto3

protobuf发布最初为v2版本(proto2),后续迭代发布v3版本(proto3)更新。

proto3相较于proto2主要更新点如下:

  • 新增更多语言支持(c#,ruby,oc等)
  • 废弃一些冗余复杂的语法和特性。(如废弃required,optional字段)
  • 引入一些新的语法规则(如repeated字段默认开启[packed = true]编码规则,新增singular字段)。

迭代发布的proto3版本并没有摒弃proto2的语法规则,而是对proto2语法进行了兼容。

若使用proto3语法规则编写proto文件,需要在定义proto文件时在开头注明如下内容,指示protobuf编译器使用proto3语法。否则虽然使用的是proto3版本库,但默认会以proto2的语法规则。

1
syntax = "proto3"

1.7 版本迭代情况

protobuf的具体版本发布及相关变更信息可通过其项目的github 发布页查看

Build software better, together

2014年10月20日发布v2.6.1版本为proto2的最后发布版本。

2016年7月28日发布v3.0.0正式版本,并开始迭代更新。

2022年9月30日发布v3.20.3版本为v3.20迭代的最终版本。

2022年5月12日反应v21.0-rc1预发布版本,并明确更改版本号定义规则,保留次要版本及补丁版本信息,去除v2与v3主版本号的区分。

关于版本号的变更可查看下方引用原文。

Versions

  • Versioning scheme is changing to decouple major versions for languages
  • Minor and patch versions will remain coupled
  • Compilers and releases will refer to the version as just the minor and micro versions (i.e. 21.0)
  • Seeherefor more information on this change

2022年5月26日发布v21.0正式版本,并开始后期迭代更新。