GOOGLE PROTOBUF学习与使用心得

先占个坑,这两天入门了protobuf,真心好用,想把学习的过程中记录下来,供自己记录与学习之用。


这边文章包括了protobuf的64位编译,使用方法以及测试。



今天有时间可以详细说说protobuf了。


本来没想到会用protobuf,记得一个项目中,涉及到网络通信的项目,通信模块的特性:在传输的过程中,先接收数据的长度,然后再接收数据,传输的是数据流,而在现实的过程中需要传输的数据可能很多样,比如一个CLASS或者STRUCT,这些传输中需要对这些非char*、string或者bytes类型的数据进行转换,这样的转换过程成为序列化,在接收时,需要对接收的数据转换成原始的数据类型,这种转换的过程称为反序列化。


综上:protobuf为我们传输数据提供了序列化与反序列的作用,听说已经有比较多的方法,但是protobuf毕竟Google出品,这方面性能有保障,使用操作起来也足够简单。

来看看怎么使用。


1、下载protobuf

随便一个网址就能得到protobuf,我用的是protobuf windows版本的,下载好之后解压

GOOGLE PROTOBUF学习与使用心得_第1张图片


得到可执行文件,这是protoc.exe可以直接执行,但是没什么用,没有proto文件


2、编译64位protobuf。(可选)因为我的项目基本都是64位下进行的,要想使用64位的protobuf,需要重新配置文件进行使用

下载protobuf源码,解压后得到的文件,用VS打开文件下vsprojects,打开protobuf.sln,重新编译protobuf,项目配置属性里设置成64位,重新生成lib和其他的文件,

在编译的过程中,会出现各种错误,比如我上篇博文说到的MAX和MIN的问题,



GOOGLE PROTOBUF学习与使用心得_第2张图片

如上图,分别编译每一项,有人说libprotobuf-lite会出问题什么的,我没有遇到,每一项都是些小错误编译成功。




GOOGLE PROTOBUF学习与使用心得_第3张图片

分别把获得的lib分64位和32位新建lib文件夹,如上图,拷贝到这些文件夹中,


文件夹下的lib只需要libprotobuf.lib,libprotoc.lib,libprotobuf-lite.lib这三个

做到这一步,我们的准备工作基本完成了,下面用工程测试使用protobuf。


3、新建proto文件:


GOOGLE PROTOBUF学习与使用心得_第4张图片

如上图,定义了一个结构体 Person,里面包含NAME,ID,Email等自定义信息,测试需要,不考虑太复杂的结构体,但是protobuf能使用的结构体远比想象的强大。


在文件夹目录下,输入protoc lisa.proto --cpp_out=.


会在文件夹下生成lisa.pb.cc 和lisa.pb.h,这两个文件我们稍后就会用到



4、新建工程项目,这里我直接使用一个通信模块进行测试。

在文件中添加现有项,把产生的cc和h文件加入工程。

项目属性设置如下图


GOOGLE PROTOBUF学习与使用心得_第5张图片GOOGLE PROTOBUF学习与使用心得_第6张图片GOOGLE PROTOBUF学习与使用心得_第7张图片



lilian::Person  person;
		person.set_id(0);
		person.set_name("lisarer");
		person.set_email("[email protected]");


		cout << "Before : ===============" << endl;
		cout << "ID:" << person.id() << endl;
		cout << "name:" << person.name() << endl;
		cout << "email:" << person.email() << endl;
		cout << endl;
		cout << endl;
		cout << endl;
		cout << endl;
		//char msg[];
		string str;
		person.SerializeToString(&str);
		char dst[2000];
		strcpy(dst, str.c_str());
		//std::stringstream ss;
		//ss << msg;
		//ss >> msg;


	//	printf_s("产生MSGGGGGGGGGGGGG=======%s\n", dst);


		Sleep(6000);
		comunMethod->SendMyMessage(dst, strlen(dst), "127.0.0.1", 5004);

在接收端同样设置,也定义

lilian::Person anotherPer;
				//lilian::Person anotherPer;
				anotherPer.ParseFromString(mydata);
				cout << "After:============================" << endl;
				cout << "ID:" << anotherPer.id() << endl;
				cout << "Name:" << anotherPer.name() << endl;
				cout << "Email:" << anotherPer.email() << endl; }


GOOGLE PROTOBUF学习与使用心得_第8张图片

成功的通过通信模块进行了结构体传输测试


…………完

你可能感兴趣的:(GOOGLE PROTOBUF学习与使用心得)