protobuf使用
编写结构
// Filename: person.proto
syntax="proto3";
package person;
message Person {
string name = 1;
int32 id = 2;
uint32 age = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
string number = 1;
PhoneType type = 2;
}
repeated PhoneNumber phone = 4;
}
生成C++文件
$ protoc -I=. --cpp_out=. person.proto
$ ls
person.pb.cc person.pb.h person.proto
编写例子
#include <iostream>
#include <iomanip>
#include "person.pb.h"
int main()
{
person::Person person;
person.set_name("furong");
person.set_id(1);
person.set_age(10);
person::Person_PhoneNumber *phone = person.add_phone();
phone->set_number("010-110");
phone = person.add_phone();
phone->set_number("130-1234-5678");
phone->set_type(person::Person::WORK);
std::cout << "number = " << phone->number() << std::endl;
phone->clear_number();
uint32_t size = person.ByteSize();
unsigned char byteArray[size];
person.SerializeToArray(byteArray, size);
for (int i = 0; i < size; i++)
{
std::cout << std::hex << std::setiosflags(std::ios::uppercase) << std::setfill('0') << std::setw(2) << static_cast<int>(byteArray[i]) << ' ';
}
std::cout << std::endl;
person::Person parse_person;
parse_person.ParseFromArray(byteArray, size);
std::cout << "*****************************" << std::endl;
std::cout << "id: " << parse_person.id() << std::endl;
std::cout << "name: " << parse_person.name() << std::endl;
std::cout << "age: " << std::dec << parse_person.age() << std::endl;
for (int i = 0; i < parse_person.phone_size(); i++)
{
const person::Person_PhoneNumber &phone = parse_person.phone(i);
std::cout << "phone_type: " << phone.type() << std::endl;
std::cout << "phone_number: " << phone.number() << std::endl;
}
std::cout << "*****************************" << std::endl;
return 0;
}
编译运行
$ g++ main.cpp person.pb.cc -I include -L lib -lprotobuf
$ ./a.out
number = 130-1234-5678
0A 06 66 75 72 6F 6E 67 10 01 18 0A 22 09 0A 07 30 31 30 2D 31 31 30 22 02 10 02
*****************************
id: 1
name: furong
age: 10
phone_type: 0
phone_number: 010-110
phone_type: 2
phone_number:
*****************************
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!