protobuf的使用

首先安装C++的Protobuf,按官方指导来: https://github.com/protocolbuffers/protobuf/tree/master/src
下载release包,解压后编译安装即可。

用法举例,先定义proto文件,如何定义protobuf网上有很多教程:

syntax = "proto3";
//实际使用中一般把package注释掉
package test;

enum Sex {
    BOY = 0;
    GIRL = 1;
}

message Student {
  int32 Id = 1;     // id
  string Name = 2;  // name
  Sex Sex = 3;
}

message Team {
    int32 Id = 1;
    string Name = 2;
    repeated Student Student = 3;
}

然后用protoc生成对应的编解码文件:
// c++文件生成命令 protoc --cpp_out=./ ./xxx.proto
// java文件生成命令 protoc --java_out=./ ./xxx.proto
//python文件生成命令 protoc --python_out=./ ./xxx.proto

#include <iostream>
#include <string>
#include "test.pb.h"

using namespace std;
using namespace test;

int main()
{
    Team team;
    team.set_id(1);
    team.set_name("Rocket");
    Student *s1 = team.add_student(); // 添加repeated成员
    s1->set_id(1);
    s1->set_name("Mike");
    s1->set_sex(BOY);
    Student *s2 = team.add_student();
    s2->set_id(2);
    s2->set_name("Lily");
    s2->set_sex(GIRL);

    // encode --> bytes stream
    string out;
    team.SerializeToString(&out);
    //或者
    int length=team.ByteSize();
    char* buf=new char[length];
    team.SerializeToArray(buf,length);    
    // decode --> team structure
    Team t;
    t.ParseFromArray(out.c_str(), out.size()); // or parseFromString,如果该出是使用ParseFromArray,上面也是应该对应
    
    cout << t.DebugString() << endl;
    for (int i = 0; i < t.student_size(); i++) {
        Student s = t.student(i); // 按索引解repeated成员
        cout << s.name() << " " << s.sex() << endl;
    }

    return 0;
}

注意:引用头文件时候注意顺序,容易出差
常用的序列化和反序列化的方法有
bool SerializeToArray(char* buf,int size) const;把message编码进数组buf.
bool ParseFromArray(const char* buf,int size);把buf解码到message。
bool SerializeToString(string* output) const;把message编码进output。
bool ParseFromString(const string& data);从string解码到message
bool SerializeToArray(char* buf,int size) const;把message编码进数组buf.
bool ParseFromArray(const char* buf,int size);把buf解码到message。
bool SerializeToOstream(ostream* output) const;把message编码进ostream
bool ParseFromIstream(istream* input);从istream解码到message

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值