Получить имя поля в родительском сообщении с помощью дескриптора поля с использованием буферов протокола

Это возможно с Google Буферы протокола чтобы получить поле название (не тип поля) родительского сообщения с использованием дескрипторов в 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. есть нет: Возможно ли это вообще (если да, можете ли вы привести мне пример)?

0

Решение

FieldDescriptor::name() (например. descriptor->name() в вашем примере) возвращает имя поля. Однако это только «заголовок» или «адресат», а не целый путь, такой как «header.addressee».

Нет способа создать целый путь из одного FieldDescriptor потому что он не содержит достаточно информации. Тип MessageHeader может быть использован во многих разных местах (не только в Message.header), поэтому с учетом дескриптора для addressee В одиночку нет способа узнать, какой сайт вы искали.

Если вы хотите отслеживать путь поля при прохождении сообщения, вам нужно будет сделать это вручную, поддерживая stack<FieldDescirptor*> или похожие.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]