一、简介

protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了三种语言的实现:javac++ 和 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 的用法

  1. 数据结构体:
  2. message message_name{message_body;}
  3. message_body格式:
  4. 例如required int32 query = 1[defaut=10];
  5. 形式为:rule type name = value[other_rule];
  6. 规则:
  7. required表示必须具有该值域;
  8. optional表示可选的值域;
  9. repeated表示可重复的值域(即>=0);
  10. 其中requered/optional是常用rule,而repeated则不常用同时因为是历史遗留现使用repeated int32 samples=4[packed=true];形式;
  11. value值:
  12. value值最小为1,是底层编码时使用其中1-15占一位,>15则会占多位;
  13. 不同的message中的value值互不干扰,常以1开始计数。
  14. 数据类型之基本类型:
  15. .proto Type             C++ Type            Java Type
  16. double                  double              double
  17. float                   float               float
  18. int32                   int32               int
  19. int64                   int64               long
  20. uint32                  uint32              int
  21. uint64                  uint64              long
  22. sint32                  int32               int
  23. sint64                  int64               long
  24. fixed32                 uint32              int
  25. fixed64                 uint64              long
  26. sfixed32                int32               int
  27. sfixed64                int64               long
  28. bool                    bool                boolean
  29. string                  string              String
  30. bytes                   string              ByteString
  31. 数据类型之复杂类型:
  32. 复杂类型主要包括:枚举,其他message,groups等。
  33. 枚举定义例如:enum Corpus{WEB=0;LOCAL=1}
  34. 枚举定义在message中。
  35. 可以使用其他message作为类型来定义成员。
  36. groups我的理解有些像C++中的union结构。
  37. 嵌套定义:
  38. 可以嵌套定义message结构,而嵌套定义的message被其他message作为成员类型时需要形式为outmessage.inmessage形式。
  39. 包结构:
  40. 定义形式:package foo.bar;
  41. 对应C++中则生成两个命名空间foo和bar,且bar定义在foo中;
  42. 可以通过import "myproject/other_protos.proto";来引入.proto文件;
  43. 引用其他package中message时需要完整的package路径;
  44. Services:
  45. 主要用于RPC系统中,在.proto中定义接口;
  46. 定义形式如例子:
  47. service SearchService {
  48. rpc Search(SearchRequest) return (SearchResponse);
  49. }
  50. .proto文件编译:
  51. 格式:
  52. protoc -–proto_path=(.proto文件路径) -–cpp_out=(.cc .java生成文件路径) (.proto文件路径)/?.proto
  53. -–proto_path  简化为:  --I
  54. 其中可根据需要更改:cpp_out选项为java_out/python_out。
  55. 例子:
  56. 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 简介 版本 安装 使用 实例的更多相关文章

  1. Google Protocol Buffer安装编译及使用

    近期玩了玩谷歌的Protocol Buffer.以下就简介下 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准.眼下已经正在使用的 ...

  2. Google Protocol Buffer的安装与.proto文件的定义

    什么是protocol Buffer呢? Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准. 我理解的就是:它是一种轻便高效的结构 ...

  3. Google Protocol Buffer的安装与.proto文件的定义(转)

    转自(https://www.cnblogs.com/yinheyi/p/6080244.html) 什么是protocol Buffer呢? Google Protocol Buffer( 简称 P ...

  4. Google Protocol Buffer 的使用和原理[转]

    本文转自: http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构 ...

  5. Google Protocol Buffer 的使用和原理

    Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它 ...

  6. 【Google Protocol Buffer】Google Protocol Buffer

    http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Google Protocol Buffer 的使用和原理 Protocol Buffers ...

  7. 转Google Protocol Buffer 的使用和原理

    Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它 ...

  8. Google Protocol Buffer 的使用和原理(无论对存储还是数据交换,都是个挺有用的东西,有9张图做说明,十分清楚)

    感觉Google Protocol Buffer无论对存储还是数据交换,都是个挺有用的东西,这里记录下,以后应该用得着.下文转自: http://www.ibm.com/developerworks/ ...

  9. Google Protocol Buffer入门

    简介 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 ...

随机推荐

  1. Delphi XE中String、ANSIString、TBytes之间的转换

    一.string转为ansistring1.直接赋值 (有警告)2.ansistring()类型强制转换.(无警告) 二.ansistring 转为string 1.直接赋值 (有警告)2.strin ...

  2. ssh 多条命令执行

    格式:ssh user@ip command 单条命令:ssh user@ip command1 多条命令:ssh user@ip "command1;command2" 不加双引 ...

  3. Linux学习20-nohup挂后台启动django

    前言 django在linux上运行,一般在xshell远程连接后,是通过python manage.py runserver 0.0.0.0:8000启动服务.但是这样有个弊端,窗口关闭服务就停止了 ...

  4. HTML5文件上传qq、百度、taobao等比较(改进支持三种状态提示)

    拖拽过程详解: 1:文件未拖出文件选择框的时候提示:将要上传的文件或文件夹拖拽至此区域 2:文件拖出文件选择框但未拖入上传的文件框提示:请继续拖拽文件或文件夹至此区域 3:文件拖出文件选择框且已拖入上 ...

  5. 摩登家庭第一季/全集Modern Family迅雷下载

    本季Modern Family Season 1 第一季(2009)看点:<摩登家庭>瞄准的是三对各有不同的美国家庭:一对普通父母与三个孩子.一对同性恋夫夫从越南领养了养女组成三口之家,一 ...

  6. 实用ExtJS教程100例-009:ExtJS Form无刷新文件上传

    文件上传在Web程序开发中必不可少,ExtJS Form中有一个filefield字段,用来选择文件并上传.今天我们来演示一下如何通过filefield实现ExtJS Form无刷新的文件上传. 首先 ...

  7. [Web 前端] superagent-nodejs处理请求的模块

    cp from : https://blog.csdn.net/xiao_chun5316/article/details/48164435 关于superagent,这次写react组件,发送请求都 ...

  8. JUnit - 测试框架

    什么是 Junit 测试框架? JUnit 是一个回归测试框架,被开发者用于实施对应用程序的单元测试,加快程序编制速度,同时提高编码的质量.JUnit 测试框架能够轻松完成以下任意两种结合: Ecli ...

  9. maskrcnn_benchmark代码分析(3)

    数据结构 数据加载 数据后处理

  10. iOS开发-UITapGestureRecognizer手势

    手势在iOS开发中是一个比较常用的功能,不过相对来说大家用的比较少,经常刷网易新闻,上次用了一下捏合手势才发现可以调整字体大小.昨天看到一个介绍摇一摇这个功能的,没看到之前一直都觉得摇一摇是微信的专有 ...