我有一条动态protobuf
消息,我不知道此消息包含哪些字段。
我想要做的是,将所有字段的所有值都放在一个字符串中,例如,消息包含2个字段string name = "Jack";
和int age = 12;
,我想要的最终结果是{ {1}}。
这是我的想法,因为我不知道此消息中包含哪些字段,所以我需要遍历消息以获取所有字段的名称,类型(可以通过"name:Jack, age:12"
访问),然后得到每个字段的值,这是最烦人的部分,因为我需要写一个很长的
Descriptor
我想知道还有其他更好的主意吗?
答案 0 :(得分:0)
这基本上是Protobuf自己的TextFormat
课所做的:
https://github.com/google/protobuf/blob/master/src/google/protobuf/text_format.cc#L1473
您可以在编写自己的代码时使用该代码作为示例。这确实相当乏味,但实际上没有更好的方法。
答案 1 :(得分:0)
Message* message = &your_proto;
const google::protobuf::Descriptor* desc = message->GetDescriptor();
const google::protobuf::Reflection* ref = message->GetReflection();
for (int i = 0; i < desc->field_count(); ++i) {
const google::protobuf::FieldDescriptor* field_desc = desc->field(i);
switch (field_desc->cpp_type()) {
case google::protobuf::FieldDescriptor::CPPTYPE_INT32:
// call get_int32
break;
case google::protobuf::FieldDescriptor::CPPTYPE_INT64:
// call get_int64
break;
...
}
}