google protocol buffer 使用说明
一:编译源码
下载地址: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 使用说明的更多相关文章
- Google Protocol Buffer 的使用和原理[转]
本文转自: http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构 ...
- Google Protocol Buffer 的使用
简介 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 ...
- 学习Google Protocol buffer之概述
XML这种属于非常强大的一种格式,能存储任何你想存的数据,而且编辑起来还是比较方便的.致命的缺陷在于比较庞大,在某些情况下,序列化和解析都会成为瓶颈.这种对于实时性很强的应用来说,就不太适合了,想象下 ...
- Google Protocol Buffer的安装与.proto文件的定义
什么是protocol Buffer呢? Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准. 我理解的就是:它是一种轻便高效的结构 ...
- Google Protocol Buffer 的使用和原理
Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它 ...
- Google Protocol Buffer 的编码方式
Google Protocol Buffer 使用到了两种编码方式:Varints 和 zigzag. 一 Varints 编码 每个 byte 只用 7bit 表示数字,最高位 bit作为标志位,如 ...
- Google Protocol Buffer 协议
1. Protocol Buffers 简介 Protocol Buffers (ProtocolBuffer/ protobuf )是Google公司开发的一种数据描述语言,类似于XML能够将结构化 ...
- Google Protocol Buffer
Google Protocol Buffer(protobuf)是一种高效且格式可扩展的编码结构化数据的方法.和JSON不同,protobuf支持混合二进制数据,它还有先进的和可扩展的模式支持.pro ...
- 【Google Protocol Buffer】Google Protocol Buffer
http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Google Protocol Buffer 的使用和原理 Protocol Buffers ...
随机推荐
- Java Script
一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司 ...
- jpype调用jar
import easyguiimport osfrom jpype import * jarpath = "d:\jar"print "jarPath: %s" ...
- (BFS)poj2935-Basic Wall Maze
题目地址 题目与最基本的BFS迷宫的区别就是有一些障碍,可以通过建立三维数组,标记某个地方有障碍不能走.另一个点是输出路径,对此建立结构体时要建立一个pre变量,指向前一个的下标.这样回溯(方法十分经 ...
- Node.js 事件
Node.js 事件 Node.js 所有的异步I/O 操作在完成时都会发送一个事件到事件队列. Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, ...
- 再议C++的性能
最近在公司里的项目做的是性能优化,相关性能调优的经验总结也在前一篇文章里说了.这里再说一说和性能相关的东西.主要针对的是C++类库中常用的一些数据结构,比方说std::string.顺序容器(vect ...
- Python的平凡之路(11)
一. rabbitmq 1 进程Queue: 父进程与子进程进行交互,或者同属于同一父进程下多个子进程进行交互 2 队列通信: send1.py #!/usr/bin/env python#Au ...
- SecureCRT清屏
Ctrl + l:清屏Ctrl + c:终止命令Ctrl + z:挂起命令
- php大力力 [041节] 今天没有写日志哈
php大力力 [041节] 今天没有写日志哈 如何下拉,左边的side颜色 能顺延下去?? 今天做了一个表格显示
- OpenSSL - RSA非对称加密实现
非对称加密:即两端使用一对不同的密钥进行加密. 在非对称加密中,需要两对密钥,公钥和私钥. 公钥个私钥属于对立关系,一把加密后,只有另一把才可以进行解密. 公钥数据加密 数字证书内包含了公钥,在进行会 ...
- 2、JS中的表达式和运算符
一.表达式 1.原始表达式:2.14,“test”,true/false,null……复合表达式:10*20…… 2.数组.对象的初始化表达式:new Array(1,2),[1,undefined, ...