protobuf协议概览及开发指南
来源:互联网 发布:内存卡修复软件 编辑:程序博客网 时间:2024/06/16 01:03
Protobuf协议概览及开发指南
l 什么是protocol buffer
l 如何使其工作
l 与XML相比有哪些优势?
l 听起来像是不错的解决方案,如何开始?
l 历史原因
本文档作为protocol buffer的开发者指南,它是一种语言无关、跨平台、扩展性良好的用于通信、数据存储的结构化数据串行化方法。
本文档的读者是希望使用protocol buffer的Java、C++或Python开发者。这个概览简要介绍了protocol buffer,并告诉你如何开始。当然你可以参考以下的编程指导深入了解protocolbuffer编码方式http://code.google.com/apis/protocolbuffers/docs/encoding.html。
API参考文档http://code.google.com/apis/protocolbuffers/docs/reference/overview.html同样也是提供了这三种编程语言的版本。
不同协议语言http://code.google.com/apis/protocolbuffers/docs/proto.html和样式http://code.google.com/apis/protocolbuffers/docs/style.html用于指导如何更规范的编写 .proto 文件。
l 什么是protocol buffer
ProtocolBuffer是一种用于结构化数据串行化的灵活、高效、自动的方法,有如XML,不过它更小、更快、也更简单。可以自定义数据结构,然后使用代码生成器生成的代码来读写这个数据结构。甚至可以在无需重新部署程序的情况下更新数据结构。
l 如何使其工作
首先需要在一个 .proto 文件中定义需要做串行化的数据结构信息。每个ProtocolBuffer信息是一小段逻辑记录,包含一系列的键值对。如下有一个简单的 .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;
}
正如你所见,消息格式非常简单,每个消息类型拥有一个或多个特定的数字字段,每个字段拥有一个名字和一个值类型。值类型可以是数字(整数或浮点)、布尔型、字符串、原始字节或者其他ProtocolBuffer类型,还允许数据结构的分级。可以指定可选字段,必选字段和重复字段。可以在http://code.google.com/apis/protocolbuffers/docs/proto.html到更多关于如何编写 .proto文件的信息。
在完成自定义消息报文后,就可以运行ProtocolBuffer编译器,根据选定的语言类型将.proto 文件编译成特定语言的类。这些类提供了简单的方法访问每个字段(像是 query() 和 set_query() ),像是访问类的方法一样将结构串行化或反串行化。例如可以选择C++语言,运行编译如上的协议文件生成类叫做 Person 。随后就可以在应用中使用这个类来串行化的读取报文信息。代码示例如下:
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;
当然,你可以在不影响向后兼容的情况下任意给数据结构增加字段,旧有的数据会忽略新的字段。所以如果使用ProtocolBuffer作为通信协议,可以无须担心破坏现有代码的情况下进行协议扩展。
可以在API参考http://code.google.com/apis/protocolbuffers/docs/reference/overview.html中找到完整的参考,关于ProtocolBuffer的报文格式编码则可以在http://code.google.com/apis/protocolbuffers/docs/encoding.html中找到。
l 与XML相比有哪些优势?
ProtocolBuffer拥有比XML更高级的串行化结构数据的特性,ProtocolBuffer:
Ø 更简单
Ø 小3-10倍
Ø 快20-100倍
Ø 更少的歧义
Ø 可以方便的生成数据存取类
例如,在XML中建模Person的name和email字段,代码示例如下:
<person>
<name>John Doe</name>
<email>jdoe@example.com</email>
</person>
ProtocolBuffer协议对应的报文如下:
#ProtocolBuffer的文本表示
#这不是正常时使用的二进制数据
person {
name: "John Doe"
email: "jdoe@example.com"
}
当这个报文编码到ProtocolBuffer的二进制格式http://code.google.com/apis/protocolbuffers/docs/encoding.html时只需要28字节和100-200ns的解析时间。而XML的版本需要69字节(除去空白)和5000-10000ns的解析时间。
当然,操作ProtocolBuffer也很简单,示例如下:
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()
<< end;
当然,ProtocolBuffer并不是在任何时候都比XML更合适,例如ProtocolBuffer无法对一个基于标记文本的文档建模,因为根本无法方便的在文本中插入结构。另外,XML是便于阅读和编辑的,而ProtocolBuffer则不是。还有XML是自解释的,而ProtocolBuffer仅在拥有报文格式定义的 .proto 文件时才有意义。
l 听起来像是不错的解决方案,如何开始?
在地址http://code.google.com/p/protobuf/downloads/下载包,包含了Java、Python、C++的ProtocolBuffer编译器,用于生成你需要的IO类。跟随README的指令就可以做到构建和安装编译器。
安装好之后,就可以跟着编程指导http://code.google.com/apis/protocolbuffers/docs/tutorials.html来选择语言-随后就是使用ProtocolBuffer创建一个简单的应用了。
l 历史原因
ProtocolBuffer最初是在Google开发的,用以解决索引服务器的请求、响应协议。在使用ProtocolBuffer之前,有一种格式用以处理请求和响应数据的编码和解码,并且支持多种版本的协议。而这最终导致了丑陋的代码,有如:
if (version==3) {
...
}else if (version>4) {
if (version==5) {
...
}
...
}
通信协议因此变得越来越复杂,因为开发者必须确保,发出请求的人和接受请求的人必须同时兼容,并且在一方开始使用新协议时,另外一方也要可以接受。
ProtocolBuffer设计用于解决这一类问题:
Ø 很方便引入新字段,而中间服务器可以忽略这些字段,直接传递过去而无需理解所有的字段。
Ø 格式可以自描述,并且可以在多种语言中使用(C++、Java等)。
然而用户仍然需要手写解析代码。随着系统的演化,他需要一些其他的功能:
Ø 自动生成编码和解码代码,而无需自己编写解析器。
Ø 除了用于简短的RPC(Remote ProcedureCall)请求,人们使用ProtocolBuffer来做数据存储格式(例如BitTable)。
Ø RPC服务器接口可以作为 .proto 文件来描述,而通过ProtocolBuffer的编译器生成存根(stub)类供用户实现服务器接口。
ProtocolBuffer现在已经是Google的混合语言数据标准了,现在已经正在使用的有超过48,162种报文格式定义和超过12,183个.proto 文件。他们已经将其成功应用于RPC系统和持续数据存储系统。
- protobuf协议概览及开发指南
- protobuf协议语言指南
- protobuf协议语言指南
- protobuf协议语言指南
- Protocol Buffers(Protobuf)开发者指南---概览
- Protocol Buffers(Protobuf)开发者指南---概览
- Protocol Buffers(Protobuf)开发者指南---概览
- Google Protobuf开发指南
- protobuf开发指南
- [重要]protobuf协议语言指南
- ProtoBuf例子及google ProtoBuf开发者指南
- adb概览及协议参考
- adb概览及协议参考
- NDK 开发指南---Android NDK概览
- AngularJS开发指南04:核心概览
- adb概览及协议参考(深度)
- Android开发中集成protobuf协议
- protobuf指南
- Quartz Coordinate System
- 把ASP.NET页面的内容存进Execl
- Android ApiDemo 笔记(一)Content与Graphics
- 两只麻袋
- 自己经常用到的工具网站
- protobuf协议概览及开发指南
- poj 3270 Cow Sorting
- JQuery最佳实践
- ubuntu如何修改默认的文件关联打开程序 转自:http://blog.csdn.net/blueboy82006/article/details/5305497
- html 文字 justify 两端对齐
- JNI 实例调用 转载
- 除法
- windows 7下visual studio 2008破解试用版的评估期结束
- Unable to open class file