protobuf安装和简单使用demo

一直以来对于程序的数据管理都是自己写程序的实现的,大多就是读写文件的操作,感觉还好。

近来发现谷歌有一个数据管理的神器,叫做Protobuf,可以轻松帮我们完成这些操作,因此乘着闲暇弄起来玩玩。

因为本人比较喜欢VS,因此在Windows上编程的多,本篇先在Windows上实现protobuf的安装和简单的demo使用,后面Ubuntu的实现也会放上来。

本文参考的是这篇博客,谢谢这位老哥,写的很详细。但可能因为这位老哥是新手(绝无贬低的意思),感觉有些东西说的过于详细,没有必要。因此如果是新手可以看看这位老哥的,可能会更有帮助。

首先下载protobuf

因为本人用的是C++,因此本篇只实现C++版本的,其他版本估计也差不多。

下载完后解压缩。发现需要CMake来编译,因此如果没有CMake的先下载一波。

下载完解压后打开,配置如下:

注意,第二项是编译后输出的文件件,需要自己创建。

好了之后点击"Configure",出现如下弹窗,本人要用64位的,因此选择Win64

选完后点击"Finish",等一下出现如下界面:

点击"Generate",就无痛完成了。下面定位到之前创建的protobufbuild文件夹下:

用VS打开,然后编译(这里我是全部编译了的,也可以需要什么编译什么,不过本人懒得那么做。另外,需要编译两次,一次release,一次debug)。编译出来的文件中,"libprotobuf.lib"和"libprotobufd.lib"是我们想要的,而"protoc.exe"则是帮助我们生成数据管理的程序,十分重要。当然,用debug生成的可能会慢一点,这里本人选择的是release版本的。

到此我们准备完了所有的东西,其实protobuf本身就是一个程序,可以帮助我们生成管理数据的代码。我们可以直接拷贝"libprotobuf.lib"和"protoc.exe"到一个单独的文件夹下(注意这里有release和debug版本的区别,虽然exe名字一样,但需一一对应),然后写一个数据格式如下:

Person.proto

syntax="proto2";
package dong;//包名,也就是命名空间
message PersonInfo{//相当于类对象
	required string name=1;
	required uint32 age=2;
	required uint32 phone_num=3;
}

message Person{//相当于列表,该对象会多次重复,由protobuf帮忙管理
	repeated PersonInfo people=1;
}

现在我们有了如下三个文件:

将控制台cd到三个文件下,然后运行:

.\protoc.exe --cpp_out=./ .\Person.proto

则会生产两个新的文件:

这两个东西才是我们真正想要的,我们可以把它们加入到自己的工程来实现数据的管理。另外,我们可以尝试打开这两个文件(代码量比较要命,难怪那么强大),会发现有如下一段包含关系:

也就是说,要用这两个文件,需要包含一个叫做google的文件夹,这个文件夹就在我们下载的代码包里面,不要慌,位置为"protobuf-3.6.1\src"。把它也拷出来加入到我们工程的包含目录即可。

下面我们来总结下要在工程中应用protobuf需要的东西,首先是"libprotobuf.lib"或者"libprotobufd.lib"(视release和debug而定)静态链接库,其次是生成的".cc"和".h"两个文件。最后,还有源码包中的"google"文件夹。如下:

最下面的两个是用来生成".cc"和".h"的,可以不用,但为了修改方便,一般也会带着。

下面我们将建一个最小工程把这东西用起来。

首先创建一个空白的控制台工程,然后把东西放到工程下面,如下:

注意"include"里面放着的是google文件夹。

然后配置工程:

OK,然后编写代码运行即可。代码如下:

#include <iostream>
#include <fstream>
#include "Person.pb.h"
using namespace std;
int main()
{
	dong::PersonInfo personinfo;
	personinfo.set_age(21);
	personinfo.set_name("niubi");
	personinfo.set_phone_num(1);
	//将数据写入文件中
	std::fstream out("person.pb", std::ios::out | std::ios::binary | std::ios::trunc);
	personinfo.SerializeToOstream(&out);
	out.close();
	//从文件中读取数据
	dong::PersonInfo mypersoninfo;
	std::fstream in("person.pb", std::ios::in | std::ios::binary);
	if (!mypersoninfo.ParseFromIstream(&in)) {
		std::cerr << "Failed to parse person.pb." << std::endl;
		exit(1);
	}
	cout << "name: " << mypersoninfo.name() << endl;
	cout << "phonenum: " << mypersoninfo.phone_num() << endl;
	//释放内存对象
	google::protobuf::ShutdownProtobufLibrary();
}

上面代码实现了利用protobuf进行文件的写入和读回的操作。

如果想要存多个对象则可用如下代码操作:

#include <iostream>
#include <fstream>
#include "Person.pb.h"
using namespace std;
int main()
{

	dong::PersonInfo *personinfo;
	dong::Person personlist;
	personinfo = personlist.add_people();
	personinfo->set_age(21);
	personinfo->set_name("niubi");
	personinfo->set_phone_num(1);
	personinfo = personlist.add_people();
	personinfo->set_age(22);
	personinfo->set_name("hh");
	personinfo->set_phone_num(2);
	//将数据写入文件中
	std::fstream out("person.pb", std::ios::out | std::ios::binary | std::ios::trunc);
	personlist.SerializeToOstream(&out);
	out.close();

	//从文件中读取数据
	dong::Person myPersonlist;
	std::fstream in("person.pb", std::ios::in | std::ios::binary);
	if (!myPersonlist.ParseFromIstream(&in)) {
		std::cerr << "Failed to parse person.pb." << std::endl;
		exit(1);
	}
	for (size_t i = 0; i < myPersonlist.people_size(); i++)
	{
		const dong:: PersonInfo myPersonlistinfo = myPersonlist.people(i);
		cout << "name: " << myPersonlistinfo.name() << endl;
		cout << "phonenum: " << myPersonlistinfo.phone_num() << endl;
	}
	//释放内存对象
	google::protobuf::ShutdownProtobufLibrary();
}

 

 

 

 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值