C++Protobuf的生成与使用

    科技2022-07-13  102

    编写.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);
    Processed: 0.010, SQL: 8