您的位置:首页 > 其它

protobuf使用方法

2015-08-11 18:38 393 查看
person.proto文件

[cpp] view
plaincopy

message Person{  

    required string name = 1;  

    required int32 age = 2;  

    optional string email = 3;  

    enum PhoneType{   

        MOBILE = 1;  

        HOME = 2;  

        WORK = 3;  

    }  

    message Phone{  

        required int32 id = 1;  

        optional PhoneType type = 2 [default = HOME];  

    }  

    repeated string phoneNum = 4;  //对应于cpp的vector  

}  

安装好protoc以后,执行protoc person.proto --cpp_out=. 生成 person.pb.h和person.pb.cpp

写文件(write_person.cpp):

[cpp] view
plaincopy

#include <iostream>  

#include "person.pb.h"  

#include <fstream>  

#include <string>  

  

using namespace std;  

  

int main(){  

    string buffer;  

    Person person;  

    person.set_name("chemical");  

    person.set_age(29);  

    person.set_email("ygliang2009@gmail.com");  

    person.add_phonenum("abc");  

    person.add_phonenum("def");  

    fstream output("myfile",ios::out|ios::binary);  

    person.SerializeToString(&buffer); //用这个方法,通常不用SerializeToOstream  

    output.write(buffer.c_str(),buffer.size());  

    return 0;  

}  

编译时要把生成的cpp和源文件一起编译,如下:g++ write_person.cpp person.pb.cpp -o write_person -I your_proto_include_path -L your_proto_lib_path -lprotoc -lprotobuf运行时记得要加上LD_LIBRARY_PATH=your_proto_lib_path

读文件(read_person.cpp):

[cpp] view
plaincopy

#include <iostream>  

#include "person.pb.h"  

#include <fstream>  

#include <string>  

  

using namespace std;  

  

int main(){  

    Person *person = new Person;  

    char buffer[BUFSIZ];  

    fstream input("myfile",ios::in|ios::binary);  

    input.read(buffer,sizeof(Person));  

    person->ParseFromString(buffer);  //用这个方法,通常不用ParseFromString  

    cout << person->name() << person->phonenum(0) << endl;  

    return 0;  

}  

编译运行方法同上:g++ read_person.cpp person.pb.cpp -o read_person -I your_proto_include_path -L your_proto_lib_path -lprotoc -lprotobuf
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: