使用Protocol Buffers使用字段描述符检索父消息中的字段名称

时间:2015-09-24 10:12:38

标签: c++ reflection protocol-buffers descriptor

Google Protocol Buffers是否可以使用C ++中的描述符检索父邮件的字段名称字段类型)?

考虑以下最小例子:

message MessageHeader {
  string addressee = 1;
}

message Message {
  MessageHeader header = 1;
}

我想使用以下函数检索字符串"header.addresse"

std::string createFieldQueryFrom(
    const google::protobuf::FieldDescriptor* const descriptor)
{
  // TODO(wolters): The descriptor for the containing FIELD is required. Is
  // there a way to retrieve it?
  //
  // containing_descriptor->name() returns "Message", what I want is
  // "header"!
  const google::protobuf::Descriptor* containing_descriptor{
      descriptor->containing_type()};

  // TODO(wolters): Add recursion if able to get the actual attribute name of
  // the containing FIELD.

  return "";
}
  1. 这是可能的,还是google::protobuf::FieldDescriptor实例没有提供完成该任务所需的信息?
  2. 如果对1.的回答是:这是否可行(如果是的话,你能举个例子)吗?

1 个答案:

答案 0 :(得分:1)

FieldDescriptor::name()(例如,示例中的descriptor->name())会返回字段的名称。但是,这只是"标题"或"收件人",而不是像" header.addressee"这样的整个路径。

由于它没有包含足够的信息,因此无法从单个FieldDescriptor生成整个路径。类型MessageHeader可以在许多不同的地方使用(不仅仅在Message.header中),因此仅根据addressee的描述符,无法确定您使用的是哪个用户网站寻找。

如果您想在浏览邮件时跟踪字段的路径,则需要通过维护stack<FieldDescirptor*>或类似邮件来手动执行此操作。