C++下的protobuf简单使用

[Google Protocol Buffer API简单使用总结]

大致步骤如下:

1、编写“msg.proto”文件

package lm;//我理解成命名空间
message helloworld//我理解成类
{
        required int32   id=1;//必选类型,每条消息中都必须包含此域
        required string  str=2;
        optional int32   opt=3;//可选类型,每条消息可包含也可不包含
        //repeated 重复类型,每条消息包含零个或任意个次域
}

2、生成protocobuf的引用文件

protoc --cpp_out=. msg.proto//它会在当前目录下会生成两个C++文件

3、编写序列化文件write.cc,调用第二步生成的C++文件进行序列化操作

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

   lm::helloworld msg1;

    msg1.set_id(101);
    msg1.set_str("hello");
    fstream output("./log", ios::out | ios::trunc | ios::binary);

    if (!msg1.SerializeToOstream(&output)) {//序列化
       std::cerr << "Failed to write msg." <<std::endl;
        return -1;
    }
    return 0;
}

4、编译write.cc,生成可执行文件,命令为

g++ msg.pb.cc write.cc -o write -I/user/local/lib/protobuf/include -lprotobuf -lpthread 

5、编写反序列化文件reader.cc,调用第二步生成的C++文件进行反序列化操作

#include "msg.pb.h"
#include <iostream>
#include <fstream>
using namespace std;
using namespace lm;
void listmsg(const lm::helloworld & msg)
{
        std::cout <<msg.id()<<std::endl;
        std::cout <<msg.str()<<std::endl;
}
int main(void)
{
        lm::helloworld msg1;
           fstream input("./log",ios::in | ios::binary);
           if(!msg1.ParseFromIstream(&input))//反序列化
           {
                std::cerr<< "Failed to prase address book"<<std::endl;
                        return -1;
           }
           listmsg(msg1);
           return 0;
}

6、编译reader.cc,生成可执行文件,命令为

g++ msg.pb.cc reader.cc -o reader -I/user/local/lib/protobuf/include -lprotobuf -lpthread

7、设置环境变量

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH/*这一步很重要,没有设置环境变量将不能之星序列化可执行文件*/

8、执行可执行文件write

./write

9、执行可执行文件reader

./reader
总结:
1、在第二步生成两个C++文件时要注意生成位置
2、生成可执行文件时要注意protobuf存在的位置,本例中的位置是默认的,由于之前未设置访问位置,导致一直找不到文件,进而不能生成可执行文件
3、在执行可执行文件之前一定要设置环境变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值