编写.proto文件
- syntax:表明protobuf的版本号(末尾不要忘了;)
- package:表明生成的类对象位于哪一个命名空间(末尾不要忘了;)
- 每一个类属性后面的必须跟一个编号,且不能重复
syntax="proto3";
package Protocol;
message User{
string name=1;
int32 age=2;
}
message UserGroup{
repeated User userList=1;
}
.proto文件转为c++类
写一个run.bat的批处理文件(只要是xxx.bat就行)
- xxx.exe:用于生成类的可执行文件
- –cpp_out:指定生成的类对象为cpp且文件保存至后面的相对路径下
- xxx.proto:用于参照的proto文件(相对路径)
- pause:在执行完成后暂停窗口(不写窗口一闪就关闭了),如果有报错就便于定位修改
如果我们有多个.proto文件那就写多行这个命令(.bat是批处理命令文件,都能执行),只根据不同的需求修改某些内容即可
protoc.exe --cpp_out=ProtobufTest2 User.proto
pause
点击.bat文件,然后你就能在写的路径下看见这些自动生成的cpp文件(仔细阅读黑窗里的文字,如果有错误照着修改即可)
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);