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版本的,下载好之后解压
![](https://img-blog.csdn.net/20160702164114937?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
得到可执行文件,这是protoc.exe可以直接执行,但是没什么用,没有proto文件
2、编译64位protobuf。(可选)因为我的项目基本都是64位下进行的,要想使用64位的protobuf,需要重新配置文件进行使用
下载protobuf源码,解压后得到的文件,用VS打开文件下vsprojects,打开protobuf.sln,重新编译protobuf,项目配置属性里设置成64位,重新生成lib和其他的文件,
在编译的过程中,会出现各种错误,比如我上篇博文说到的MAX和MIN的问题,
![](https://img-blog.csdn.net/20160702164939700?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
如上图,分别编译每一项,有人说libprotobuf-lite会出问题什么的,我没有遇到,每一项都是些小错误编译成功。
![](https://img-blog.csdn.net/20160702165412279?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
分别把获得的lib分64位和32位新建lib文件夹,如上图,拷贝到这些文件夹中,
文件夹下的lib只需要libprotobuf.lib,libprotoc.lib,libprotobuf-lite.lib这三个
做到这一步,我们的准备工作基本完成了,下面用工程测试使用protobuf。
3、新建proto文件:
![](https://img-blog.csdn.net/20160702165847417?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
如上图,定义了一个结构体 Person,里面包含NAME,ID,Email等自定义信息,测试需要,不考虑太复杂的结构体,但是protobuf能使用的结构体远比想象的强大。
在文件夹目录下,输入protoc lisa.proto --cpp.out=.
会在文件夹下生成lisa.pb.cc 和lisa.pb.h,这两个文件我们稍后就会用到
4、新建工程项目,这里我直接使用一个通信模块进行测试。
在文件中添加现有项,把产生的cc和h文件加入工程。
项目属性设置如下图
![](https://img-blog.csdn.net/20160702171222170?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20160702171232561?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20160702171238139?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
在接收端同样设置,也定义
![](https://img-blog.csdn.net/20160702171949792?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
成功的通过通信模块进行了结构体传输测试
…………完
这边文章包括了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; }
成功的通过通信模块进行了结构体传输测试
…………完
相关文章推荐
- 关于Google浏览器添加QQ电脑管家广告过滤插件出现2345主页拦截问题
- win to go在移动硬盘上制作windows系统
- Golang 中的“潜规则”
- goto编译错误,error: expected ‘;’ before ‘:’ token
- beego autorouter 使用遇到的问题
- ubuntu下最新版golang安装教程
- 使用三重嵌套循环暴力查找勾股数及不同算法的比较(Pythagorean Triples)
- golang的reflect包用在struct上
- golang的strings包的坑
- golang的并发模型
- golang的可用性测试
- GOF-23种设计模式——单例模式(学习笔记)
- 精简google-play-services.jar的方法
- 《Algorithms》——删除二叉查找树中的结点
- 投资新兴市场和细分市场 good
- 关于启动MongDB的mongod.exe文件闪退的问题
- Google chrome 浏览器搜索设置
- golang学习之regexp
- 【Go】windows下搭建go语言编译环境
- elf文件中的.plt .rel.dyn .rel.plt .got .got.plt的关系