Protocol Buffers使用教程

Protocol Buffers是一种高效的数据序列化方法,用于结构化数据的串行化,类似于XML但更小、更快。本文档详细介绍了Protocol Buffers的工作原理、安装、语言指导、编码原理,以及与其他序列化技术的性能比较,旨在帮助开发者快速理解和使用Protocol Buffers。
摘要由CSDN通过智能技术生成

Protocol Buffers使用教程

1  概述

1.1  什么是protocol buffers

ProtocolBuffer是用于结构化数据串行化的灵活、高效、自动的方法,类似 XML,不过它更小、更快、也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。你甚至可以在无需重新部署程序的情况下更新数据结构。

1.2  他们如何工作

你首先需要在一个.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 文件的信息。

 

一旦你定义了自己的报文格式(message),你就可以运行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 )中找到。

1.3  为什么不使用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无法对一个基于标记文本的文档建模(比如HTML),因为你根本没法方便的在文本中插入结构。另外,XML是便于人类阅读和编辑的,而ProtocolBuffer则不是。还有XML是自解释的,而 ProtocolBuffer仅在你拥有报文格式定义的.proto 文件时才有意义。

1.4  如何开始?

下载包( http://code.google.com/p/protobuf/downloads/ ),包含了Java、Python、C++的ProtocolBuffer编译器,用于生成你需要的IO类。构建和安装你的编译器,跟随README的指令就可以做到。

 

一旦你安装好了,就可以跟着编程指导( http://code.google.com/apis/protocolbuffers/docs/tutorials.html )来选择语言-随后就是使用ProtocolBuffer创建一个简单的应用了。

1.5  一点历史

ProtocolBuffers最初是在Google开发的,用以解决索引服务器的请求、响应协议。在使用ProtocolBuffers之前,有一种格式用以处理请求和响应数据的编码和解码,并且支持多种版本的协议。而这最终导致了丑陋的代码,有如:

 

if (version==3) {

    ...

}else if (version>4) {

    if (version==5) {

        ...

    }

    ...

}

通信协议因此变得越来越复杂,因为开发者必须确保,发出请求的人和接受请求的人必须同时兼容,并且在一方开始使用新协议时,另外一方也要可以接受。

 

ProtocolBuffers设计用于解决这一类问题:

 

很方便引入新字段,而中间服务器可以忽略这些字段,直接传递过去而无需理解所有的字段。

格式可以自描述,并且可以在多种语言中使用(C++、Java等)

然而用户仍然需要手写解析代码。

 

随着系统的演化,他需要一些其他的功能:

 

自动生成编码和解码代码,而无需自己编写解析器。

除了用于简短的RPC(Remote Procedure Call)请求,人们使用ProtocolBuffer来做数据存储格式(例如BitTable)。

RPC服务器接口可以作为 .proto 文件来描述,而通过ProtocolBuffer的编译器生成存根(stub)类供用户实现服务器接口。

ProtocolBuffers现在已经是Google的混合语言数据标准了,现在已经正在使用的有超过48,162种报文格式定义和超过12,183个 .proto 文件。他们用于RPC系统和持续数据存储系统。

2  环境安装

2.1  下载

官方下载网站http://code.google.com/p/protobuf/downloads/

2.2  安装

tar -zxvf protobuf-2.5.0.tar.gz

cd protobuf-2.5.0

./configure --prefix=$INSTALL_DIR

make

make install

更详细的安装步骤请参考源码目录下的README.txt。

 

安装完后在$INSTALL_DIR目录下生成三个目录:

bin  include  lib

bin目录下是protoc工具,用于将你的.proto文件编译成相应目标语言的编解码代码。

include和lib目录是protoc工具所依赖的头文件与库环境。

2.3  利用protoc工具编译成目标语言

编译前,先准备你的.proto文件,这里暂时以源码目录下的examples/addressbook.proto文件为例。

protoc用法:

Usage: ./protoc [OPTION] PROTO_FILES

详情请使用./protoc --help

 

开始将你的.protoc文件编译成目标语言编解码文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值