初识Protocol Buffer

本文以及后续Protobuf系列的文章内容主要来源Google的官方开发文档[1]。本人只是对其进行了总结并记录于此。同时,文章的内容不会对官方文档进行逐行的翻译,有些内容会选择性跳过,有些内容会添加自己的一些理解。因个人水平有限,如有错误,还请留言指正。

1.概念

如官方文档所言,protobuf是一种跨语言、跨平台、可扩展的序列化结构化数据的一种工具(或方法),一般用于通信协议及数据存储等方面。相比XML( Extensible Markup Language ,被设计用来传输和存储数据),protobuf更小、更快、更简单。

使用protobuf你可以自定义数据的结构化方式,以及在各种数据流和各种语言之间读写这些结构化的数据。此外,您甚至可以更新您先前定义的数据结构,而不会破坏更新前的程序。

2.机制

(1).proto文件
首先,您需要在.proto后缀的文件中自定义您想要序列化信息的结构化形式。如下所示定义了一个Person结构:

其中,
1)每个message都有一个或多个不重复的编号(如,1,2,3…);
2)每个字段都有一个类型和该类型对应的一个变量名(类似于C++中定义变量的形式,如string name),该类型可以是数字、布尔值、字符串以及message等;
3)并且,每个字段的头部都有一个限定符:required, repeated, optional,分别表示必需字段、可重复字段、可选字段。

(2)protoc编译
当你自定义完.proto文件之后,使用protobuf的编译器protoc,将您自定义的.proto文件编译成相应的源文件,并将这些源文件放入您的项目中就可以使用了。

比如,如果您的项目语言是C++,那么在通过protobuf编译器将我们在(1)中定义的Person.proto文件编译之后将生成一个名为Person的类(相应的生成诸如Person.pb.h,Person.pb.cc的文件)。那么,在项目中就可以使用这个类来序列化或反序列化相应的数据了。有如下示例,

将消息序列化到文件myfile中:


相应地,反序列化myfile文件中的数据,读取消息:

仍然需要说明的一点是:您可以在不破坏向后兼容性的情况下向message结构中添加新的字段,也就是说您可以扩展自己的协议,而不必担心破坏现有的代码。

3.Protobuf3

目前,Google已经发布了Proto3版本,相比于Proto2而言,Proto3简化了protocol buffer语言,使其更加方便使用,同时也扩展了对除C++,Python,Java之外的语言支持,如Ruby, JavaScript, Objective-C, C#等等。

4.安装Protobuf

以Linux平台下安装protobuf-cpp-3.6.1为例,其他版本或平台的安装方法可能稍有不同,具体安装方法可参考文末参考链接[3]:

(1)首先,从参考链接[2]进入,下载Protobuf,如我下载的版本是protobuf-cpp-3.6.1.tar.gz。
(2)解压缩,并进入目录:

(3)依次输入如下命令:

编译和安装的过程可能稍微有点长,耐心等待。

5.其他

至此,我们对protobuf已经有了一个初步的认识了,至于如何编写一个.proto文件以及如何使用.proto文件生成我们所需要的类文件的相关细节将在下一篇文章中介绍。

 

参考:
[1]. https://developers.google.com/protocol-buffers/docs/overview
[2]. https://github.com/protocolbuffers/protobuf/releases/tag/v3.6.1
[3]. https://github.com/protocolbuffers/protobuf/blob/master/src/README.md

发表评论

电子邮件地址不会被公开。 必填项已用*标注