C++ gRPC中oneof字段的读写及设置方法咨询
C++ gRPC/Protobuf oneof字段读写操作指引
针对你遇到的oneof字段读写问题,本质是Protobuf C++ API的使用(gRPC依赖Protobuf定义消息),以下结合你的Proto定义给出具体操作示例:
设置oneof字段
Protobuf生成的C++代码中,oneof字段不会生成直接的set_myfoo()方法,而是通过以下两种方式设置:
方式1:使用mutable_xxx()获取可修改的对象引用
这种方式会自动管理对象内存,适合大多数场景:
// 创建请求对象 ServiceMessageRequest req; // 设置普通字段status req.set_status(1); // 设置oneof中的myfoo字段 Foo* foo = req.mutable_myfoo(); foo->set_id(123); // 切换设置oneof中的mybar字段(会自动清除之前的myfoo) Bar* bar = req.mutable_mybar(); bar->set_aid(456); // 设置Bar的metadata和payload字段 bar->set_metadata("metadata_content"); bar->set_payload("payload_content");
方式2:使用set_allocated_xxx()手动管理内存
如果你已经手动创建了对象实例,可以用这个方法,但需要注意后续内存释放:
// 手动创建Bar对象 Bar* bar = new Bar(); bar->set_aid(789); bar->set_metadata("manual_metadata"); bar->set_payload("manual_payload"); // 将其设置到oneof中 req.set_allocated_mybar(bar); // 注意:此时Protobuf会接管bar的内存,不要手动delete
读取oneof字段
要读取oneof字段,首先需要判断当前激活的是哪个字段,再获取对应的值:
// 判断oneof的当前类型 switch(req.data_case()) { case ServiceMessageRequest::kMyfoo: { const Foo& foo = req.myfoo(); // 使用foo.id() break; } case ServiceMessageRequest::kMybar: { const Bar& bar = req.mybar(); // 使用bar.aid()、bar.metadata()、bar.payload() break; } case ServiceMessageRequest::DATA_NOT_SET: // 未设置任何oneof字段的处理逻辑 break; }
清除oneof字段
如果需要清除当前oneof中的字段,可以调用对应的clear_xxx()方法,或者直接调用clear_data()清除整个oneof:
// 清除myfoo字段 req.clear_myfoo(); // 或者清除整个oneof的所有可能字段 req.clear_data();
内容的提问来源于stack exchange,提问作者Prince Rambade
相关产品推荐
相关产品推荐

