翻译自:https://developers.google.com/protocol-buffers/docs/overviewhtml
Protocol buffers是一款灵活、高效、自动化的数据描述语言。相似于XML可以将结构化数据序列化,但比XML更小,更快,更简单。经过它,你能够定义你的数据的结构,并生成基于各类语言的代码。这些你定义的数据流能够轻松地再传递并不破坏你已有的程序。而且你也能够更新这些数据而现有的程序也不会受到任何的影响。ios
经过定义一些数据和结构放在一个 .proto 文件之中。每个protocol buffer 消息都是一小段结构,包含了一些名字。下面是一个.proto 文件内容的样例。git
就像你看到的,这个消息的格式是十分简单的——对于每一个消息类型都有一个或多个独特的数字字段,每个字段都有一个名称和类型,能够是数字(整型或浮点),布尔,字符,原始字节,又或者是其它的protocol buffer消息类型,例如你自定义分层的数据结构。你还能够定义可选的required和repeated字段。你能够在这里Protocol Buffer Language Guide.找到更多编写.proto文件的信息。github
在定义好了.proto文件,就能够将该文件做为protocol buffers编译器的输入文件,编译产生特定语言的数据定义代码文件了。编译器提供了简单的访问方法为每一个字段(如name()和set_name())序列化/解析整个结构到原始字节——那么,举个栗子,若是你用的是C++,用这个编译器运行上面的例子会产生一个叫Person的类。你能够在你的应用中运用这个Person protocol buffer消息。你或许须要写一些像这些的代码:golang
而后,你能够像这样读取你的消息:编程
你能够增长一些新字段到你的消息格式中,这样并不会影响向后兼容;旧的二进制文件解析时会简单地忽略新的字段。因此若是你有通信的协议是用到protocol buffers看成数据格式的话,你不用担忧扩展你的协议会影响到原有的代码。数据结构
你能够在这里API Reference section找到关于使用生成protocol buffer的完整事例,你也能够在这里Protocol Buffer Encoding找到更多内容关于protocol buffer消息是怎样编码的。ide
同XML相比,Protocol buffers在序列化结构化数据方面有许多优势:
1. 更简单
2. 数据描述文件只需原来的1/10至1/3
3. 解析速度是原来的20倍至100倍
4. 减小了二义性
5. 生成了更容易在编程中使用的数据访问类ui
举个栗子,若是你想写一个带有name和email的person。在XML里,你须要这样写:google
而相应的protocol buffer消息(应用protocol buffer文本格式)是:
当编码这段消息到protocol buffer二进制格式时(注释只是用来帮助人们调试和修改),它可能只有28字节和大约花费100到200纳秒的解释时间。可是若是用XML,它至少有69字节(若是你去掉空格)和花费5000到10000纳秒的解释时间。
并且,操做protocol buffer更加容易:
若是用XML,你不得不作这些事:
然而,protocol buffers不老是比XML好——例如,protocol buffers不是一个写基于文本的文档标记(例如HTML)的好方法,你不能轻易地交互结构和文本。还有,XML比较好看还好写,但protocol buffers,即便在原始格式下,也不是很好看,很好写。XML在某种程度上能够自描述。protocol buffer只在你有消息定义文件(.proto文件)时才有意义。
先在这里Download the package下个包——这个包已经包含了各类语言(其实就只有Java,Pythin和C++)的protocol buffer编译器完整代码,固然,你还须要I/O和testing这些类。生成和安装你的编译器前,请看看README里的说明。
当你搞定一切的时候,你能够看看你所选择的语言的tutorial——这会帮你创建一个简单的用到protocol buffers的应用。
咱们最近作了一个新版本——Protocol Buffers language version 3(又叫作proto3),你能够在这里下载alpha release,咱们加了一些新特性。咱们简化了这个语言,如今能够用在更多的语言上了(C++,Python,JavaNano,Ruby,Objective-C和C#,不过有一些限制some limitations)。你还能够用在Go上,经过最新的Go protoc插件golang/protobuf。咱们还在计划在更多的语言上用到protocol buffers。
还有一些内容和历史的问题就不翻译了。