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 ...
随机推荐
- jquery.SuperSlide.2.1.2--轮播(兼容到IE7 适用于整屏)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- Alpha 和Beta 测试
在正式发布产品之前往往要先发布一些测试版,让用户能够反馈出相关信息,或者找到存在的Bug,以便在正式版中得到解决. 特别是在有客户参加的情况下,对系统进行测试可能会出现一些我们没有考虑的情况,还可以解 ...
- Windows7系统下JAVA运行环境下载、安装和设置(第二次更新:2012年03月14日)
1.下载 地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html,(由于Sun于2009年被oracle收购所以网址 ...
- Ruby学习笔记
#!/usr/bin/ruby puts "Hello, Ruby, what is your name?" $name = STDIN.gets puts "Hi, I ...
- [vijos P1180] 选课
这一周竟然都没好好码题目,不过至少把这题的树形DP给摸了个大概.吐槽一下自己,递归已经基本不会用了…QAQ!按老师的话来说“太危险了!” 此题用到多叉树转二叉树,左孩子是真正意义的孩子(先修完自己才能 ...
- 制造业如何基于BPM做供应链管理?
公司介绍深圳市吉祥腾达科技有限公司是中国网络产业的开航者,是中国无线网络领域的首批开拓者之一.历经10年的开拓创新,已经形成了拥有自主研发的全面产品线. 为了使公司物流.资金流和信息流实现优化整合,腾 ...
- OC基础--简介
OC简介: 1986年,BradCox(布莱德·考克斯)在第一个纯面向对象语言Smalltalk基础上写成了Objective-C语言. 1985年,被赶出苹果公司的Steve Jobs成立了NeXT ...
- 游戏贴图中常用术语《DC》的理解
什么是DC呢? 在GDI中,DC(Device Context)是一个非常重要的概念. 有的书中,将DC翻译为设备描述表,也有的书中翻译为设备上下文. 但是这些翻译,无法在我们的头脑里有强烈的冲击,无 ...
- 自己动手编译apache-tomcat-6.0.41-src源码
第一步:下载apache-tomcat-6.0.41-src 第二步:阅读BUILDING.txt.了解所需要的步骤. In order to build a binary distribution ...
- Python 基礎 - 字符編碼
Python 解釋器在加載 .py 文件中的代碼時,會對內容進行編碼 (默認 ascill) ASCII (American Standard Code for Information Interch ...