Protocol Buffers(简称 Protobuf)是由 Google 开发的一种语言中立、平台中立、可扩展的序列化格式。它用于结构化数据的序列化(也称为“编组”或“消息打包”),可以看作是一种高效的二进制数据格式,类似于 JSON 或 XML,但比它们更紧凑、更高效。
核心概念
-
.proto
文件:-
这是定义数据结构的文件,你在其中使用 Protobuf 的语法来定义数据的结构、字段类型和消息格式。
-
例如:
syntax = "proto3"; message Person { string name = 1; int32 id = 2; string email = 3; }
-
这段代码定义了一个
Person
消息类型,它包含name
、id
和email
三个字段。
-
-
protoc
编译器:-
protoc
是 Protobuf 的编译器工具。它可以将.proto
文件编译成各种编程语言(如 C++、Java、Python 等)的源代码文件。 -
这些源代码文件包含用于序列化、反序列化和操作 Protobuf 消息的代码。
-
-
序列化和反序列化:
-
序列化 是将数据结构(如上面的
Person
消息)转换为一种紧凑的二进制格式以便传输或存储。 -
反序列化 是将紧凑的二进制格式数据还原为原始的数据结构。
-
-
跨平台和语言中立:
-
Protobuf 支持多种编程语言(如 C++、Java、Python、Go 等)和平台,这使得它在分布式系统、网络通信、数据存储等场景中非常有用。
-
Protobuf 的优点
-
高效性:
-
Protobuf 使用二进制格式存储和传输数据,比 JSON 和 XML 更紧凑,占用更少的空间,并且序列化和反序列化速度更快。
-
-
可扩展性:
-
你可以在不破坏现有代码的情况下添加新字段。这使得 Protobuf 在需要向后兼容的场景中非常有用。
-
-
跨语言支持:
-
Protobuf 提供了多种语言的支持,适合跨平台和跨语言的系统。
-
-
严格的类型检查:
-
与 JSON 和 XML 不同,Protobuf 提供了强类型的定义,减少了数据解析和处理时的错误。
-
典型应用场景
-
网络通信:
-
用于在分布式系统中传输数据,比如在微服务之间交换数据。
-
-
数据存储:
-
用于高效地存储结构化数据。
-
-
配置管理:
-
用于在应用程序中保存和读取配置数据。
-
-
远程过程调用(RPC):
-
配合 gRPC(Google 的开源 RPC 框架)使用,Protobuf 被用作定义接口和消息格式的协议。
-
学习一个使用到Protobuf的开源项目时,可能会因为Protobuf版本错误等原因无法运行这个项目。
可以在项目中找到.pb文件,文件开头会指明使用的版本号
如上图所示项目中Protobuf版本为3.11.0
确定版本后便可按照Protobuf:安装指定版本 | AhaKnow中的方法安装指定的Protobuf版本。
注意在git clone时可能会因为Ubuntu无法上外网而git失败,这时可以按https://www.zhihu.com/question/495148700中的方法使你虚拟机能够科学上网,从而git成功。
如果你安装的Protobuf的位置并不在项目的cmakelist.txt文件所指定的路径范围内,你还需要手动添加Protobuf的头文件和和执行文件路径,使编译时能找到Protobuf相关文件。