google protocol buffer 简介 版本 安装 使用 实例
一、简介
protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了三种语言的实现:java、c++ 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。
二、版本下载
目前的最新版是protoc-2.5.0,各个版本的下载列表的网址:http://code.google.com/p/protobuf/downloads/list
linux版本是protoc-2.5.0.tar.gz; windows版本是protoc-2.5.0.zip
三、安装
下面以linux为例 :
安装:$ tar -xzvf protoc-2.5.0.tar.gz 会解压出protobuf-2.5.0目录
$ cdprotobuf-2.5.0
$ ./configure --prefix=/usr/local/protobuf-2.5.0
$ make
$ make check
$ su 切换到root用户
# make install
配置:查看编译生成的目录
$ cd /usr/local/protobuf-2.4.1
$ ls
bin include lib
其中,bin中的protoc是.proto文件的处理器,可用这个工具生成cpp,java,python文件.
由于系统常用这个工具,可以将其ln或者直接拷贝到系统环境bin下
ln -s /usr/local/protobuf-2.4.1/bin/protoc /usr/bin/protoc
同样,可以将头文件ln或者直接拷贝到系统环境
ln -s /usr/local/protobuf-2.4.1/include/google /usr/include/google
将lib文件ln或者直接拷贝到系统环境
略,方法同上.
此时,protobuf的开发环境已经搭建了。
四 、proto buffer 的用法
- 数据结构体:
- message message_name{message_body;}
- message_body格式:
- 例如required int32 query = 1[defaut=10];
- 形式为:rule type name = value[other_rule];
- 规则:
- required表示必须具有该值域;
- optional表示可选的值域;
- repeated表示可重复的值域(即>=0);
- 其中requered/optional是常用rule,而repeated则不常用同时因为是历史遗留现使用repeated int32 samples=4[packed=true];形式;
- value值:
- value值最小为1,是底层编码时使用其中1-15占一位,>15则会占多位;
- 不同的message中的value值互不干扰,常以1开始计数。
- 数据类型之基本类型:
- .proto Type C++ Type Java Type
- double double double
- float float float
- int32 int32 int
- int64 int64 long
- uint32 uint32 int
- uint64 uint64 long
- sint32 int32 int
- sint64 int64 long
- fixed32 uint32 int
- fixed64 uint64 long
- sfixed32 int32 int
- sfixed64 int64 long
- bool bool boolean
- string string String
- bytes string ByteString
- 数据类型之复杂类型:
- 复杂类型主要包括:枚举,其他message,groups等。
- 枚举定义例如:enum Corpus{WEB=0;LOCAL=1}
- 枚举定义在message中。
- 可以使用其他message作为类型来定义成员。
- groups我的理解有些像C++中的union结构。
- 嵌套定义:
- 可以嵌套定义message结构,而嵌套定义的message被其他message作为成员类型时需要形式为outmessage.inmessage形式。
- 包结构:
- 定义形式:package foo.bar;
- 对应C++中则生成两个命名空间foo和bar,且bar定义在foo中;
- 可以通过import "myproject/other_protos.proto";来引入.proto文件;
- 引用其他package中message时需要完整的package路径;
- Services:
- 主要用于RPC系统中,在.proto中定义接口;
- 定义形式如例子:
- service SearchService {
- rpc Search(SearchRequest) return (SearchResponse);
- }
- .proto文件编译:
- 格式:
- protoc -–proto_path=(.proto文件路径) -–cpp_out=(.cc .java生成文件路径) (.proto文件路径)/?.proto
- -–proto_path 简化为: --I
- 其中可根据需要更改:cpp_out选项为java_out/python_out。
- 例子:
- protoc -I=./ --cpp_out=./ model.proto
五、简单实例
proto buf的后缀名是.proto
编写hello.proto,代码如下:
1 package hello;
message Hello{
required int32 id = 1; //user id
required string name = 2; //user name
optional string email = 3; //user email
}
接着,要用protoc生成一个对应的类,我把它生成在./out目录里:
$ protoc hello.proto --cpp_out=./out
接下来,在out目录下,会生成两个文件:
$ ls
hello.pb.cc hello.pb.h
接下来,编写测试用的c++代码,hello.cc,代码如下:
#include <stdio.h>
#include <string.h>
#include "out/hello.pb.h"
usingnamespace std;
usingnamespace hello; int main()
{
Hello a;
a.set_id(0818);
a.set_name("liangzhijun"); string tmp;
bool ret = a.SerializeToString(&tmp);
if (ret)
{
printf("encode success!\n");
}else{
printf("encode faild!\n");
} Hello b; ret = b.ParseFromString(tmp);
if (ret)
{
printf("decode success!\n id= %d \n name = %s\n", b.id(), b.name().c_str());
}else{
printf("decode faild!\n");
} return0;
}
接着,编译一下这个代码,由于使用了protobuf的库,所以编译的时候,要把这些库也链接进来:
g++ hello.cc ./out/hello.pb.cc -o hello -I./out -I/usr/local/protobuf/include -L/usr/local/lib -lprotobuf
这样,就生成了测试程序。
运行一下:
$ ./hello
encode success!
decode success!
id= 0818
name = liangzhijun
六、参考
1.http://blog.csdn.net/eclipser1987/article/details/8525383
google protocol buffer 简介 版本 安装 使用 实例的更多相关文章
- Google Protocol Buffer安装编译及使用
近期玩了玩谷歌的Protocol Buffer.以下就简介下 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准.眼下已经正在使用的 ...
- Google Protocol Buffer的安装与.proto文件的定义
什么是protocol Buffer呢? Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准. 我理解的就是:它是一种轻便高效的结构 ...
- Google Protocol Buffer的安装与.proto文件的定义(转)
转自(https://www.cnblogs.com/yinheyi/p/6080244.html) 什么是protocol Buffer呢? Google Protocol Buffer( 简称 P ...
- Google Protocol Buffer 的使用和原理[转]
本文转自: http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构 ...
- Google Protocol Buffer 的使用和原理
Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它 ...
- 【Google Protocol Buffer】Google Protocol Buffer
http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Google Protocol Buffer 的使用和原理 Protocol Buffers ...
- 转Google Protocol Buffer 的使用和原理
Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它 ...
- Google Protocol Buffer 的使用和原理(无论对存储还是数据交换,都是个挺有用的东西,有9张图做说明,十分清楚)
感觉Google Protocol Buffer无论对存储还是数据交换,都是个挺有用的东西,这里记录下,以后应该用得着.下文转自: http://www.ibm.com/developerworks/ ...
- Google Protocol Buffer入门
简介 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 ...
随机推荐
- Visual Studio 2013 sqlce 配置(转)
Visual Studio 2013 把內建 SQL CE 的管理工具拿掉了 下载SQL Server Compact Toolbox by ErikEJ并安装 打开VS2013,新建一工程,在“视图 ...
- Linkedin工程师是如何优化他们的Java代码的
http://greenrobot.me/devpost/java-faster-less-jvm-garbage/ Linkedin工程师是如何优化他们的Java代码的 最近在刷各大公司的技术博客的 ...
- Android:调用其他程序中的activity和Permission Denial: starting Intent 错误解决办法
今天想调试多个task中栈的情况,在测试程序中调用另一个程序的activity, 代码片段如下: btnStartX=(Button)findViewById(R.id.btnStartX); btn ...
- Selenium:Hello,World!
背景 伟鹏同学在学习自动化测试了,开发人员也有必要学习一下,有如下好处: 可以开发一些小工具. 可以熟悉一下自动化测试开发技术. 代码 using System; using Microsoft.Vi ...
- Linux学习18-gitlab新建项目提交代码
前言 gitlab前面已经搭建好了,如果我们想用把代码上传到gitlab仓库上的话,先要新建一个项目仓库.然后本地安装git环境,就可以提交了 root用户 gitlab首次在浏览器上打开web页面, ...
- 详解UILabel的adjustsFontSizeToFitWidth值
详解UILabel的adjustsFontSizeToFitWidth值 UILabel有一个属性值,叫adjustsFontSizeToFitWidth,看着名字就知道,他是用来让文字自动适应UIL ...
- 【转】ubuntu apt-get update 失败解决
FROM : http://blog.csdn.net/ronghua_liu/article/details/8609450 当运行apt-get update后出现如下错误时:E: Some in ...
- [转]HIVE UDF/UDAF/UDTF的Map Reduce代码框架模板
FROM : http://hugh-wangp.iteye.com/blog/1472371 自己写代码时候的利用到的模板 UDF步骤: 1.必须继承org.apache.hadoop.hive ...
- Netty 4.0.0.CR6 发布,高性能网络服务框架
Netty 4.0 发布第 6 个 RC 版本,该版本值得关注的改进有: SslHandler and JZlibEncoder now works correctly. (#1475 and #14 ...
- Chapter 6 -- Caches
CachesExplained Explanation for how to use Guava caches. explained Updated Jun 4, 2013 by lowas...@g ...