C++Protobuf的生成与使用

编写.proto文件
  1. syntax:表明protobuf的版本号(末尾不要忘了;)
  2. package:表明生成的类对象位于哪一个命名空间(末尾不要忘了;)
  3. 每一个类属性后面的必须跟一个编号,且不能重复
syntax="proto3";
package Protocol;
message User{
	string name=1;
	int32 age=2;
}
message UserGroup{
	repeated User userList=1;
}
.proto文件转为c++类

写一个run.bat的批处理文件(只要是xxx.bat就行)

  1. xxx.exe:用于生成类的可执行文件
  2. –cpp_out:指定生成的类对象为cpp且文件保存至后面的相对路径下
  3. xxx.proto:用于参照的proto文件(相对路径)
  4. pause:在执行完成后暂停窗口(不写窗口一闪就关闭了),如果有报错就便于定位修改

如果我们有多个.proto文件那就写多行这个命令(.bat是批处理命令文件,都能执行),只根据不同的需求修改某些内容即可

protoc.exe --cpp_out=ProtobufTest2 User.proto
pause

点击.bat文件,然后你就能在写的路径下看见这些自动生成的cpp文件(仔细阅读黑窗里的文字,如果有错误照着修改即可)

image-20201004093326699

C++使用Protobuf对象
/*************************属性获取与修改**********************************/
Protocol::User user;
user.set_age(10);//设置对象的属性
int age = user.age();//获得对象属性
Protocol::UserGroup UG;
auto p= UG.add_userlist();//在数组属性中增加一个元素,返回的是指向增加元素的指针
*p = user;//通过指针修改新增元素
Protocol::User user2 = UG.userlist(0);//获得数组属性中指定下标元素(没有索引的方式)
/***********************************序列化与反序列化***************************************/
string str;
UG.SerializeToString(&str);
Protocol::UserGroup UG2;
UG2.ParseFromString(str);
/****************************************反射********************************************/
string protoName="Protocol.UserGroup";//需要生成的类名字(前面是命名,命名空间的名称)
//通过DescriptorPool获得对象的descriptor
auto descriptor = google::protobuf::DescriptorPool::generated_pool()->FindMessageTypeByName(protoName);
//使用descriptor获得对象类型
auto type = google::protobuf::MessageFactory::generated_factory()->GetPrototype(descriptor);
//实例化
auto message = type->New();
//为实例化的对象反序列化数据
message->ParseFromString(str);
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值