您的位置:首页 > 编程语言 > Go语言

GOOGLE PROTOBUF学习与使用心得

2016-06-22 11:31 691 查看
先占个坑,这两天入门了protobuf,真心好用,想把学习的过程中记录下来,供自己记录与学习之用。

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

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

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

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

来看看怎么使用。

1、下载protobuf

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



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

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

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

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



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



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

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

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

3、新建proto文件:



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

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

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

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

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

项目属性设置如下图







lilian::Person  person;
person.set_id(0);
person.set_name("lisarer");
person.set_email("lisarer@gmail.com");

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
4000
);
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; }




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

…………完
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: