Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1966659
  • 博文数量: 606
  • 博客积分: 9991
  • 博客等级: 中将
  • 技术积分: 5725
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-17 19:07
文章分类

全部博文(606)

文章存档

2011年(10)

2010年(67)

2009年(155)

2008年(386)

分类: 嵌入式

2010-07-26 16:46:36

概述:

protocol buffers是一个语言中立,平台中立,可扩展的序列化结构数据的方式
可用于通讯协议,数据存储等方面。

文档的目标定位于使用protocol buffers开发的Java,C++或者Python开发人员。这个概述介绍了protocol Buffers并告诉你如何开始使用。
然后你就可以跟着教程继续深入研究prorocol buffer的编码。API参考文档也提供三种语言的。还给出了如何写.proto文件的文档。
proto
文件估计是与语言无关的文件,类似CORBAidl文件

 

什么是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表示

 
    John Doe
    jdoe@example.com
 

当消息编码成二进制格式(上面的说明只是为了编译阅读的表示方式),protocol buffer将差不多28个子节长,用100-200ns时间解析。
XML文件有69字节长,还要去掉空白符,使用5000-10000ns来解析

 

维护以很容易:
  cout << "Name: " << person.name() << endl;
  cout << "E-mail: " << person.email() << endl;

 

XML要做如下的事情:
  cout << "Name: "
       << person.getElementsByTagName("name")->item(0)->innerText()
       << endl;
  cout << "E-mail: "
       << person.getElementsByTagName("email")->item(0)->innerText()
       << endl;

 

可是,protocol buffers并不是一直都比XML-例如,protocol buffers不适合描述符号文本,如HTML,因为你不能很好的组织文本。
另外,XML更易于阅读和编辑。protocols buffers也不是自描述的(不知什么意思?)

并且,protocol buffersgoogle内部已经广泛使用。

 

比较

XML | JSON | PB | Lua
数据结构支持 | 复杂结构 | 简单结构 | 较复杂结构 | 复杂结构
数据保存方式 | 文本 | 文本 | 二进制 | 文本
数据保存大小 | 大 | 一般 | 小 | 一般
解析效率 | 慢 | 一般 | 快 | 稍快
语言支持程度 | 非常多 | 多 | C++/Java/Python | 多
开发难度?繁琐? | 繁琐 | 简单 | 简单 | 相对繁琐
学习成本 | 低 | 低 | 低 | 高
适用范围 | 数据交换 | 数据交换 | 数据交换 | 数据保存及脚本处理

阅读(1455) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~