protobuf是Google公司出的一个的序列化工具,用了一段时间,感觉很不错。
我主要将它用于程序相关的配置信息进行保存读取。
使用方法:
- 下载protobuf源码,编译生成相关的lib文件。下面给出我已经编译好的lib和头文件,并且包含一个生成头文件和源文件的批处理文件,使用起来十分方便;下载地址
- 编辑XXX.proto文件,将需要的结构体进行定义
package conf;
message IpStruct
{
required string ipstr = 1;
}
message ConfigInfo
{
optional int32 fsInst = 1;
optional int32 trgOps_BR = 2;
optional int32 trgOps_RP = 3;
optional int32 recNum = 4;
repeated IpStruct ipArray = 5;
}
下面是三个关键字的意思:required:一个格式良好的消息一定要含有1个这种字段。表示该值是必须要设置的;optional:消息格式中该字段可以有0个或1个值(不超过1个)。repeated:在一个格式良好的消息中,这种字段可以重复任意多次(包括0次)。重复的值的顺序会被保留。
3. 编辑完.proto文件以后,运行批处理,会生成一个.h和.cc文件,如果proto文件编写的有语法错误,就不会生成,批处理中会有错误提示。
4. 在使用的工程中添加生成的.h和.cc文件,包含头文件和lib文件。就可以使用protobuf了。
conf::ConfigInfo *m_pConfigInfo = new conf::ConfigInfo;
m_pConfigInfo->set_fsinst(6); //设置值
m_pConfigInfo->fsinst(); //读取值
//列表数据的添加
conf::IpStruct *ipStru = m_pConfigInfo->add_iparray();
ipStru->set_ipstr("127.0.0.1");
//两种访问方式
conf::IpStruct *pIpStru = pConfInfo->mutable_iparray(i);
conf::IpStruct ipStru = pConfInfo->iparray(i);
//读取本地文件
string filePath = "xxx.conf";
ifstream ifs(filePath,ios::binary);
if (ifs.is_open())
{
if (!m_pConfigInfo->ParsePartialFromIstream(&ifs))
{
return false;
}
ifs.close();
}
//保存到本地
bool bInited = m_pConfigInfo->IsInitialized();//检查有没有初始化,这个很重要,如果有些量没有初始化,会保存出错
string filePath = "xxx.conf";
ofstream ofs(filePath,ios::binary);
if (ifs.is_open())
{
if (!m_pConfigInfo->SerializeToOstream(&ofs))
{
return false;
}
ofs.close();
}