译自 https://developers.google.com/protocol-buffers/docs/overview
Protocol Buffers提供了语言中立、平台中立,并且可扩展的序列化结构数据以用于通信协议、数据存储等的方法。只需要定义一次数据结构,就可以简单地使用特别生成的源代码来使用各种语言,从各种数据流读写结构数据。甚至可以更新数据结构,而不影响已经发布的、使用旧格式的程序。
1 Protocol Buffers是如何工作的?
1.1 编写.proto文件
在.proto文件中定义protocol buffer消息格式。protocol buffer消息是一个小的逻辑记录,包含一系列名字-值对。
![google <wbr>protocol <wbr>buffers <wbr>开发者指南 google <wbr>protocol <wbr>buffers <wbr>开发者指南](https://i-blog.csdnimg.cn/blog_migrate/d815ca256252ba013e8cdb5cc455ad7d.png)
消息格式很简单:每个消息可以包含一个或者多个具有唯一编号的字段,每个字段可以有名字和值类型,而值类型可以是数值(整数或者浮点数)、布尔值、字符串、原始字节,甚至可以是其他消息类型,以便构成数据层次。可以指定字段是可选的、必须的、重复的。
1.2 编译.proto文件
根据应用程序使用的编程语言,使用protocol buffer编译器编译.proto文件,生成数据访问类。数据访问类为每个字段提供了简单的访问器(如query()和set_query()),为整个结构提供了序列化/解析方法。例如,对于前面的Person定义,可以使用下列代码进行序列化:
![google <wbr>protocol <wbr>buffers <wbr>开发者指南 google <wbr>protocol <wbr>buffers <wbr>开发者指南](https://i-blog.csdnimg.cn/blog_migrate/b24598cc2a544ca065880e7f32d2e4ab.png)
而使用下述代码进行解析:
![google <wbr>protocol <wbr>buffers <wbr>开发者指南 google <wbr>protocol <wbr>buffers <wbr>开发者指南](https://i-blog.csdnimg.cn/blog_migrate/8d0795a3a3ddcfd5de338f00545a5047.png)
可以在消息格式中添加新的字段而不破坏向后兼容性:旧的可执行程序在解析的时候会简单地忽略新的字段。
2 为什么不使用XML?
相比于XML,protocol buffers有下述优点:
· 更简单
· 小3到10倍
· 快20到100倍
· 二义性较少
· 生成的数据访问类容易用于编程
例如,用XML定义一个包含name和email的person模型:
![google <wbr>protocol <wbr>buffers <wbr>开发者指南 google <wbr>protocol <wbr>buffers <wbr>开发者指南](https://i-blog.csdnimg.cn/blog_migrate/8fb1c7cc5b6d31c463362ff5ff588968.png)
而protocol buffer的定义则为(text_format):
![google <wbr>protocol <wbr>buffers <wbr>开发者指南 google <wbr>protocol <wbr>buffers <wbr>开发者指南](https://i-blog.csdnimg.cn/blog_migrate/eb57b13600091c8fa4c4e8ea20e3db94.png)
上述消息编码成protocol buffer二进制格式(上述文本格式只是为了方便人类读取,用于调试和编辑)后大概有28字节长,解析耗时100到200纳秒。而移除空白后的XML格式至少为69字节,解析耗时5000到10000纳秒。
此外,操作protocol buffer更简单:
![google <wbr>protocol <wbr>buffers <wbr>开发者指南 google <wbr>protocol <wbr>buffers <wbr>开发者指南](https://i-blog.csdnimg.cn/blog_migrate/f7aeb0a15df554ff391cc009aba07726.png)
而XML操作代码可能是:
![google <wbr>protocol <wbr>buffers <wbr>开发者指南 google <wbr>protocol <wbr>buffers <wbr>开发者指南](https://i-blog.csdnimg.cn/blog_migrate/011d04c6734a22e69c987ea25a00ff8d.png)
然而,protocol buffers并不总是比XML好。比如说,protocol buffers就不适合用于表达带标记的基于文本的文档(如HTML)。此外,XML便于人类阅读和编辑,而protocol buffer,至少是其原始格式,是不适于人类阅读和编辑的。XML也是自描述的。而protocol buffer只在你有消息定义(.proto文件)的时候才有意义。
3 如何开始?
下载安装包。安装包包含用于Java、Python、C++的完整源代码,以及C++编译器和用于IO与测试的类。根据README的指示,构建和安装编译器。
设置好之后,阅读用于你选定的语言的概述文档,它会引导你创建一个使用protocol buffers的简单应用。