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

        Protocol Buffers 介绍

posted on 2011-02-28 18:00  cvbnm  阅读(7608)  评论(3编辑  收藏  举报

导航