Protocol Buffer简介、安装与使用
2016-06-19 11:47
369 查看
Protocol Buffer简介、安装与使用
1.Protobuf
简介
Google Protocol Buffer(简称Protobuf)是Google公司内部的混合语言数据标准,是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。可用于通信协议、数据存储等领域的语言无关(支持Java、C++、Python…)、平台无关、拓展性好的序列化结构数据格式。Protobuf是用于结构化数据串行化的灵活、高效、自动的方法,有如XML、JSON,不过它更小、更快、也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。你甚至可以在无需重新部署程序的情况下更新数据结构。
2.Protobuf如何工作
你首先需要在一个 .proto文件中定义你需要做串行化的数据结构信息。每个Protobuf信息是一小段逻辑记录,包含一系列的键值对。这里有个非常简单的.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;
}
如你所见,消息格式很简单,每个消息类型拥有一个或多个特定的数字字段,每个字段拥有一个名字和一个值类型。值类型可以是数字(整数或浮点)、布尔型、字符串、原始字节或者其他Protobuf类型,还允许数据结构的分级。你可以指定可选字段,必选字段和重复字段。你可以在(http://code.google.com/apis/protocolbuffers/docs/proto.html )找到更多关于如何编写.proto
文件的信息。
一旦定义了自己的报文格式(message),你就可以运行Protobuf编译器,将你的.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;
你可以在不影响向后兼容的情况下随意给数据结构增加字段,旧有的数据会忽略新的字段。所以如果使用Protobuf作为通信协议,你可以无须担心破坏现有代码的情况下扩展协议。
可以在API参考(http://code.google.com/apis/protocolbuffers/docs/reference/overview.html )中找到完整的参考,而关于Protobuf的报文格式编码则可以在(http://code.google.com/apis/protocolbuffers/docs/encoding.html )中找到。
3.为什么不用XML?
Protobuf拥有多项比XML更高级的串行化结构数据的特性,Protobuf:· 更简单
· 小3-10倍
· 快20-100倍
· 更少的歧义
· 可以方便的生成数据存取类
例如,让我们看看如何在XML中建模Person的name和email字段:
<person>
<name>John Doe</name>
<email>jdoe@example.com</email>
</person>
对应的ProtocolBuffer报文则如下:
#Protobuf的文本表示
#这不是正常使用的二进制数据
person {
name: "John Doe"
email: "jdoe@example.com"
}
当这个报文编码到Protobuf的二进制格式时(上面的文本仅用于调试和编辑),它只需要28字节和100-200ns的解析时间。而XML的版本需要69字节(除去空白)和5000-10000ns的解析时间。
当然,操作Protobuf也很简单:
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;
当然,Protobuf并不是在任何时候都比XML更合适,例如Protobuf无法对一个基于标记文本的文档建模,因此你根本没法方便的在文本中插入结构。另外,XML是便于人类阅读和编辑的,而Protobuf则不是。还有XML是自解释的,而Protobuf仅在你拥有报文格式定义的.proto
消息包文件时才有意义。
Protobuf 优点
比XML更简洁、高效
跨平台、跨语言
向下兼容、易升级
代码自动生成、不用手写
Protobuf 缺点
应用不够广
二进制格式导致可读性差
缺乏自描述
4.Protobuf安装
首先下载protobuf源码包在Ubuntu的终端里输入:
$ wget http://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz
下载之后解压: $ tar xvzfprotobuf-2.5.0.tar.gz
进入到解压后的目录: $ cd protobuf-2.5.0
若是下载自github的代码,需要先执行:$ ./autogen.sh生成configure文件
执行 : $ ./configure
在执行./configure这个命令之前最好把vim,g++,make安装好,不然在执行./configure的时候可能会出现错误,上面三个安装的命令:
$sudo apt-get install vim
$sudo apt-get install g++
$sudo apt-get install make
./configure成功之后,接下来是如下几步:
$make
$make check
$make install //在执行这一步的时候,需要管理员权限,如果是这样的话,$make install 这条命令就换成$sudo make
install
下面要修改一下配置文件:$ vim ~/.profile
在打开的文件中,在文件末尾添加如下代码,加载动态库路径:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
然后保存退出,接下来执行: $ source ~/.profile
使刚才修改的配置文件生效,接下来执行:
$protoc --version
如果上面的步骤一切顺利的话,那么就会在终端显示protobuf的版本号,如下
到这Protobuf安装完成。
5.Protobuf应用
下面用一个简单程序测试一下,在测试之前最好先建立一个文件夹,例如上面的proto,接下的操作都在这个文件夹下进行。先用vim创建并编辑.proto文件,例如:$ vim msg.proto
内容如下:
然后执行下面的命令: $ protoc -I=. --cpp_out=. msg.proto
执行这条命名之后,在当前目录下就会生成如下的两个文件:
这两个文件就是根据上面的那个msg.proto文件生成了,里面有类的声明和类的实现,我们可以进入这两个文件。研究一下,这里就不在说明了。然后我们就可以调用类和里面的函数实现自己的功能了,下面是两个简单的测试文件:
我们先创建: $ vim write.cc
内容如下:
然后编译write.cc,命名如下:
$ g++ msg.pb.cc write.cc -o write `pkg-config --cflags --libs protobuf` -lpthread
执行生成的write文件,命令为:
$ ./write
可看到生成的msg.pb文件,这个文件是由
fstream output(“./msg.pb”,ios::out|ios::trunc|ios::binary)函数生成的
下面再创建一个文件:$ vim reader.cc
内容如下:
编译reader.cc文件:命令为:
$ g++ msg.pb.cc reader.cc -o reader `pkg-config --cflags --libs protobuf` -lpthread
然后执行生成的reader文件。命令如下:
./reader
在终端就会打印出:
101
Hello
上面在生成可执行文件的过程,都是我们一条一条命令的输入,我们可以写Makefile,然后执行一条make命令,就可以自动生成可执行文件,
编写Makefile文件:$ vim Makefile
内容如下:
编写完之后,执行:$make
就会自动生成可执行文件write和reader
看到别人也有写,该文章不完整的也可参考:
http://blog.csdn.net/Emilio563/article/details/50819788
相关文章推荐
- C#使用Protocol Buffer(ProtoBuf)进行Unity中的Socket通信
- python如何通过protobuf实现rpc
- 我的Protobuf消息设计原则
- 化繁为简--google protobuf
- c++ java中关于protobuf反序列化对象实体和实体处理(函数)关系 (一)
- c++ java中关于protobuf反序列化对象实体和实体处理(函数)关系(二)
- Google 的开源技术protobuf 简介与例子
- Some Notes of Protocol Buffer C++
- rabbitmq学习
- Google Protocol Buffer 的使用和原理
- protobuf通过反射来赋值
- TDEngine数据包的详细说明
- FlatBuffers与protobuf性能比较
- gogoprotobuf使用(上)
- gogoprotobuf使用(下)
- vs2012编译protobuf
- protocol buffer 编解码
- IOS之rpc实现
- protobuf 学习