Google串行化
Google Protocol Buffer
Google 公司内部的混合语言数据标准,他们用于 RPC (远程过程调用协议)系统和持续数据存储系统。可以用于结构化数据串行化,或者说序列化。据说跨平台跨语言(按统一网络协议在网上传输,同一个proto文件用编译器按不同语言编译调用文件)。
Google Protoc安装:
1.下载
Google官方下载地址http://code.google.com/p/protobuf/downloads/list,下载protoc-2.4.0-win32.zip是编译器,但单靠它还不能用。下载protobuf-2.4.0.zip,这是源码包。
2.编译
Google提供了各种语言的编译环境,可以直接在.\vsprojects目录下打开vc工程sln,编译在Debug文件夹下生成lib和exe文件: lite-test.exe; protoc.exe; test_plugin.exe; tests.exe; libprotobuf-lite.lib; libprotobuf.lib; libprotoc.lib。(这次用VS2010打开,几个编译错误,测试的几个test.exe没生成,但使用的主要是protoc.exe)
3.设置编译环境
双击\vsprojects\extract_includes.bat文件将在该文件目录下生成include文件夹。include包含头文件和 libprotobuf-lite.lib; libprotobuf.lib; libprotoc.lib是要加入工程的。
.proto文件的消息格式
protoc.exe就是下载的protoc-2.4.0-win32.zip编译器,将写的标准proto文件编译成C++头文件和类文件。最好把它放入OS“环境变量”中,可以直接运行。
最开始的proto文件,文件的命名最好遵循一定规则:命名空间.类名.proto
package ASpace; //相当于命名空间 message A{ //类1 required int a = 1; //变量 required float b = 2; required bool c = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } struct D{ //结构体定义 required int x; required int y; } required D d = 4; //结构体 repeated D e = 5; //数组repeated,没有默认值(当然) } message B{ //类2 optional int i = 1; //optional 可以不赋值 optional int j = 1 [dafault = 0]; //required、optional可以有默认值 }
几个不正确的地方:1)Google里没有int类型,在.proto文件里要写int32。2)同样没有struct,而用message表示结构体。3)枚举类型定义里枚举变量不用指定标识号,但结构体定义里的分量要有。
package ASpace; //相当于命名空间 message A{ //类1 required int32 a = 1; //变量 required float b = 2; required bool c = 3; message D{ //结构体、类,统一定义为 message,实际上是嵌套类 required int x = 0; //也是有标识号的 required int y = 1; } repeated D d = 4; //结构体,数组,无默认值 enum E //枚举定义 { MOBILE = 0; HOME = 1; WORK = 2; } repeated D e = 5 [dafault = HOME ];//枚举 } message B{ //类2 }
编译.proto文件
运行protoc.exe,即命令行 protoc -I={输入目录} --cpp_out={输出目录} ASpace.A.proto ,生成ASpace.A.pd.h和ASpace.A.pb.cc
//protoc -I=.\ --cpp_out=.\ ASpace.A.proto
推荐:cd proto文件所在目录(protoc已加入环境变量) protoc -I=.\ --cpp_out=.\ ASpace.A.proto
生成的C++类
package ASpace —— namespace ASpace
message D —— class A_D; //结果类、嵌套类和结构体都统一生成类
message A —— class A;
{ A(); virtual ~A(); A(const A& from); A& operator=(const A& from); descriptor(); //构造析构拷贝函数
ByteSize(); SetCachedSize(int size); GetCachedSize(); SharedCtor(); SerializeWithCachedSizes(); 等等
static const int k字段名FieldNumber = k;
//基本数据类型
bool has_字段名();
clear_字段名();
::google::protobuf::int32\float\bool 字段名() const; //
void set_字段名(int32\float\bool value);
//嵌套类
typedef A_D D; ::A::A_D& 类字段() const; //返回引用,此字段是成员变量嘛
没有set_字段,(毕竟是类)::A::A_D* mutable_d(); ::A::A_D* release_d();
//int32数组
数组字段_size() const; inline void clear_数组字段(); int32* add_数组字段(); int32* 数组字段(int index);
}
使用在C++工程中
将A.pb.h, A.pb.cc添加进工程。在工程属性页中,配置属性->C/C++->常规->附加包含目录中添加:include文件夹
配置属性->链接器->输入->附加依赖库中添加:3个lib
由于VS的特性,在cc文件开头添加#inlcude "stdafx.h"
对整个工程进行编译和链接,生成可执行程序。
其它相关文章:Protocol Buffer Basics