概述:protocol buffers是一个语言中立,平台中立,可扩展的序列化结构数据的方式可用于通讯协议,数据存储等方面。文档的目标定位于使用protocol buffers开发的Java,C++或者Python开发人员。这个概述介绍了protocol Buffers并告诉你如何开始使用。然后你就可以跟着教程继续深入研究prorocol buffer的编码。API参考文档也提供三种语言的。还给出了如何写.proto文件的文档。proto文件估计是与语言无关的文件,类似CORBA的idl文件 什么是protocol buffers?Protocol buffers是一个灵活的,高效的,有自动机制(可能指编解码)工具用于序列化结构数据。类似XML,但中茄是更小、更快、更简单。你定义你的结构化数据,然后就可以使用工具生成的特殊代码方便的使用各种语言(前面支持的三种)从各种数据流中读写你的结构化数据。你甚至可在不打断已经部署的程序的情况下重新更新你的数据结构(热部署)。 如何工作?你可以通过.proto文件定义你需要序列化的信息。每个buffer消息是一个逻辑记录,包括一系列名值对。下面是一个关于一个人的信息的.proto文件的例子message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4;}象你看到的一样猛档,消息格式很简单:每个消息类型有一个或者多个数据项,每个数据项有一个名字和一个数据类型。数据类型可以是数值(整形或者浮点型),布尔型,字符串,字节流或者自定义的buffer类型,允许你子架构造数据体系。你可以指定可选的数据项,必选数据项和重复数据项。关于如何写.proto文件,可以从protocol buffer language指南中得到更多信息。 定义了消息后,就可以protocol buffer编译器编译,从.proto文件生成数据访问类。(与corba idl类似)这些类提供了简单的访问数据项的方法,类似query(),set_query()你可以在你的应用中使用这些类来构造、序列化和取回Person这个protocol buffer消息。你可以写如下代码:Person person;person.set_name("John Doe");person.set_id(1234);person.set_email("jdoe@example.com");fstream output("myfile", ios::out | ios::binary);person.SerializeToOstream(&output); 然后,从文件中读回信息fstream input("myfile", ios::in | ios::binary);Person person;person.ParseFromIstream(&input);cout << "Name: " << person.name() << endl;cout << "E-mail: " << person.email() << endl; 你可以增加数据项,不用考虑前向兼容;旧的代码仅仅是简单的忽略新增的项。 如果你使用protocol buffer作为你的通讯协议,你能够扩展你的协议,不用担心影响已经存在的代码。你可在API文档中找到完整的参考资料,并能够了解协议是如何编解码的。 为什么不使用XML?protocol buffer有很多枝培乱XML不具备的优点:1.简单;2.小巧:3-10倍3.效率高:20-100倍4.无二义性5.有自动工具生成访问类;(其实ASN.1, CORBA都有类似工具)例如,Person模型使用xml表示