如何从Google Proto Buf消息的属性名称中查找消息类型?

时间:2019-05-21 23:12:25

标签: c++ protocol-buffers proto

我有如下定义的protobuf消息。我需要从属性名称中找到消息类型。例如,当输入为“ cfgMsg”时,输出应为ConfigMsg或CfgServerMsg.ConfigMsg(全名)。

pointer position - distance from corner of dragged element - position of the parent element relative to the page

我有以下代码。但是,这适用于定义明确的类型,例如字符串,整数,浮点数等,对于消息,它仅将“消息”作为输出打印。

我删除了一些代码,只提供了与此问题相关的代码。因此,这显然不是完整的代码。

message CfgServerMsg {
  string name = 1;
  ConfigMsg cfgMsg = 2;
}

message ConfigMsg {
  string cfgName = 1;
  uint32 msgId = 2;
}

输出: 类型:字符串 类型:消息

但是,我想获取的实际消息类型是“ ConfigMsg”,而不仅仅是“ message”。 protobuf是否有可用的此类API?

我确实彻底检查了此页面https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.descriptor#FileDescriptor.name.details,但找不到任何有用的东西。

如果有人做过类似的事情或对此有所了解,那将很有用。

谢谢

1 个答案:

答案 0 :(得分:0)

我从另一个小组那里得到了一些线索,我可以用C ++编写代码以获取实际的消息类型。在下面发布详细信息以帮助他人。

google::protobuf::Message *modObj = new ModObj();

const google::protobuf::Descriptor *outModDesc 
            =  modObj->GetDescriptor();
const Reflection *outModRefl = modObj->GetReflection();
const FieldDescriptor *field;

// Loop to iterate over all the fields
{
  field = outModDesc->FindFieldByName(tmp_name);
  std::string type = field->type_name();
  std::cout << "Type:" << type << std::endl;

  outField = outModDesc->FindFieldByName(tmp_name);
  const google::protobuf::Descriptor* tmpDesc = outField->message_type();
  std::string subMsgType = tmpDesc->name();
  std::string fullMsgType = tmpDesc->full_name();
  std::cout << " Type: " << subMsgType
                        << ", Full Type: " << fullMsgType << std::endl;
  }

代码输出:

Type: ConfigMsg, FullType: frrcfg.ConfigMsg