迭代所有字段并在protobuf消息中获取它们的值

时间:2014-12-29 11:55:48

标签: c++ protocol-buffers

我有一条动态protobuf消息,我不知道此消息包含哪些字段。

我想要做的是,将所有字段的所有值都放在一个字符串中,例如,消息包含2个字段string name = "Jack";int age = 12;,我想要的最终结果是{ {1}}。

这是我的想法,因为我不知道此消息中包含哪些字段,所以我需要遍历消息以获取所有字段的名称,类型(可以通过"name:Jack, age:12"访问),然后得到每个字段的值,这是最烦人的部分,因为我需要写一个很长的

Descriptor

我想知道还有其他更好的主意吗?

2 个答案:

答案 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;
    ...
  }
}