一:编译源码

下载地址:http://code.google.com/p/protobuf/downloads/list

下载后,根据编译说明进行编译。

windows 平台,直接打开msvc中的工程文件,直接编译。

unix/linux平台,先进行configure,在make。

生成的结果中有库文件有:

libprotobuf.lib

可执行文件有:

protoc.exe

头文件:

根据提供的extract_includes.bat文件,提取公共头文件。

二:编写proto文件

根据需要,编写proto文件。

三:生成头文件

编写完proto文件后,接下来,用proto.exe生成.h和.cc文件。

命令如下:

protoc.exe -proto_path=SRC --cpp_out=DST SRC/addressbook.proto

其中--proto_path指出proto文件所在的目录,--cpp_out则是生成的代码文件要放的目录,最后的一个参数指出proto文件的路径。如上述命令中可以看出,将SRC目录下的addressbook.proto编译后放在DST目录下,应该会生成addressbook.pb.h和addressbook.pb.cc文件

四:与工程进行集成

需要把生成的.h和.cc导入到工程中去,在需要用到数据解析的文件中,引用该.h文件。

需要把libprotobuf.lib添加到项目的依赖库中。

五:推荐做法:

建立文件夹pbbuff,在其中创建3个子文件夹:bin,lib,include,其中:

bin 存放proto.exe文件

lib 存放libprotobuf.lib 文件

include 存放公共头文件

创建环境变量PBROOT,指向pbbuff文件。把%PBROOT%/bin添加到系统的环境变量PATH中,以便能识别proto命令。

六:引用共用结构定义

6.1 结构定义

在目前common/pubffer目录创建com文件夹,放置共用的buffer结构定义。如定义公共buffer文件为rms.common.proto文件其中定义的共用message类型

message CrdInfo

{

optional bytes crdid  = 1;

optional bytes crdcode= 2;

}

在其他文件需要文件中引用该buffer结构,如:

// 文件开头导入要引用的公共buffer文件

import "rms.common.proto";

message CrdFistAudit

{

repeated CrdInfo crdinfo = 1;

optional bytes CreateUser  = 2;

optional bytes CreateDate= 3;

}

6.2 文件生成

公共buffer结构文件生成.cc和.h文件和以前一样,照常生成。引用公共buffer文件的proto文件生成.cc和.h文件时,需要指定引用公共buffer文件的路径,在protoc命令后面添加--proto_path选项,值为引用的文件所在的目录。如下面用到的共用buffer所在的目录为:E:\project\pbtest\com

6.3 结构使用

6.3.1 赋值

如使用上面定义的结构CrdFistAudit为例,我们使用的方式一般如下,会声明一个保存CrdFistAudit列表的buffer结构如:

message LCrdFistAudit

{

repeated  CrdFistAudi  crdinfo = 1;

}

在后台从数据库取值填buffer时如下:

LCrdFistAudit auditList;

// 向列表中插入一条记录

CrdFistAudit* paudit = auditList.add_crdfistaudit();

填写改条记录的各字段值,普通字段的值照旧,下面只说明公共buffer结构的填写。

// 声明一个公共buffer结构的指针

CrdInfo* pcrd = paudit.add_crdinfo();

然后用pcrd给公共的结构各字段赋值。

6.3.2 取值

取值时跟以前方式类似,只是在取公共buffer结构时有点不同,如:

从列表中取出一条记录:

LCrdFistAudit auditList;

CrdFistAudit audit = auditList.crdfistaudit(i);

// 从该记录中取出公共buffer结构

CrdInfo crdinfo = audit.crdinfo(0) // 注,由于在填值的时候只插入了一条记录,所有此处序号一直都是0。

取出公共buffer结构后,按字段取值照旧。

6.3.3 网络传输

l 发送

把buff内容通过socket发送,只需要把buff内容序列化到string中,然后就可以得到内容的缓冲区,拷贝数据包的数据区就可以了:

string fdata;

PBNS::HpUpFileMsg_Request ureq; // buff对象

// 给buff赋值,这块根据具体的buff而定

PBNS::HpFileBean* file = ureq.add_upfile();

// 这块是通用的,把填好内容的buff序列化到string中

ureq.SerializeToString(&fdata);

然后就可以把string通过网络发送出去

l 接收

从网络接收到缓冲区msg,长度length 。反序列化过程如下:

// 该buff对象根据具体协议,用不同的buff对象。

PBNS::HpUpFileMsg_Request req ;

// 把缓冲区内容序列号到buff对象

req.ParseFromArray(msg,length);

获得buff对象后,可以使用buff对象,读取其中定义的数据值。

google protocol buffer 使用说明的更多相关文章

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

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

  2. Google Protocol Buffer 的使用

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

  3. 学习Google Protocol buffer之概述

    XML这种属于非常强大的一种格式,能存储任何你想存的数据,而且编辑起来还是比较方便的.致命的缺陷在于比较庞大,在某些情况下,序列化和解析都会成为瓶颈.这种对于实时性很强的应用来说,就不太适合了,想象下 ...

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

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

  5. Google Protocol Buffer 的使用和原理

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

  6. Google Protocol Buffer 的编码方式

    Google Protocol Buffer 使用到了两种编码方式:Varints 和 zigzag. 一 Varints 编码 每个 byte 只用 7bit 表示数字,最高位 bit作为标志位,如 ...

  7. Google Protocol Buffer 协议

    1. Protocol Buffers 简介 Protocol Buffers (ProtocolBuffer/ protobuf )是Google公司开发的一种数据描述语言,类似于XML能够将结构化 ...

  8. Google Protocol Buffer

    Google Protocol Buffer(protobuf)是一种高效且格式可扩展的编码结构化数据的方法.和JSON不同,protobuf支持混合二进制数据,它还有先进的和可扩展的模式支持.pro ...

  9. 【Google Protocol Buffer】Google Protocol Buffer

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

随机推荐

  1. rpm安装和卸载软件

    1.安装 rpm -i 需要安装的包文件名 举例如下: rpm -i example.rpm 安装 example.rpm 包: rpm -iv example.rpm 安装 example.rpm ...

  2. Windows7系统下JAVA运行环境下载、安装和设置(第二次更新:2012年03月14日)

    1.下载 地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html,(由于Sun于2009年被oracle收购所以网址 ...

  3. DES MAC PIN HEX

    /* void DesEncrypt( UCHAR * auchInput,UCHAR * auchKey,UCHAR * auchOutput=NULL); Function: DesEncrypt ...

  4. 【转载】JSP常用跳转方式

    转自:http://blog.csdn.net/wanghuan203/article/details/8836326 (1)href超链接标记,属于客户端跳转 (2)使用javascript完成,属 ...

  5. 读<jquery 权威指南>[1]-选择器及DOM操作

    今天是小年了,2013马上要过去了,但是学习不能间断啊.最近正在看<jQuery权威指南>,先温习一下选择器和DOM操作. 一.基本选择器 1.table单双行: $(function ( ...

  6. JS如何判断包括IE11在内的IE浏览器 <转载>

    今天碰到一个奇怪的问题,有一个页面,想指定用IE浏览器打开,在VS开发环境没有问题,但部署到服务器上,即使是用IE打开页面,还是提示“仅支持IE”,真是晕啊!! 判断是否IE浏览器用的是window. ...

  7. [TD Cup 2014] TDL的YC牌 & TDL的幼儿园

    TDL的YC牌 传说中的置换群?反正不懂.我的思路竟然是对的,可是为何只有20分? (1)尼玛每行数据输出后回车不打! (2)写gcd函数脑残把a mod b写成a-b,大大减慢速度… (3)看标程才 ...

  8. Hadoop1.2.1 全集群3节点安装-rpm安装

    1.在三个节点上安装JDK RPM 2.在三个节点上安装HADOOP-1.2.1 RPM rpm方式安装和gz解压方式安装后的目录结构有些不同.安装好之后无需设置HADOOP_HOME环境变量 [ro ...

  9. java 泛型详解

    public class Base<T>{    Class classType=T.class;    public Base(){     //想在这里 得到T的类对象 赋值给 cla ...

  10. Android 生成颜色器

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&q ...