С++ google protobuf: как создать MutableExtension из FieldDescriptor расширения

У меня есть прототип с сообщением, содержащим расширения

message MsgA
{
    extensions 10 to 50;
}

У меня есть другой прототип с расширениями (показано только одно из расширений ниже)

extend MsgA
{
    optional MsgB msgB = 10;
}
message MsgB
{
    required int32 value = 1;
}

С помощью кода protobuf я могу получить дескриптор и дескриптор файла для MsgB, а оттуда я могу получить расширение «msgB», имеющее тип FieldDescriptor. Я нахожу расширения с помощью кода protobuf по сравнению с использованием сгенерированного кода из прототипа MsgB, поскольку я пытаюсь выполнить итерацию по всем сообщениям расширения, а не жестко кодировать каждое из них в MutableExtension. (Я понимаю жестко закодированный способ MutableExtension(MsgB::msgB), но хочу использовать полученное расширение)

Я хочу заполнить изменяемое расширение MsgA расширением msgB, но MutableExtension принимает тип

(const ::google::protobuf::internal::ExtensionIdentifier& id) или

(const ::google::protobuf::internal::ExtensionIdentifier& id, int index)

Как я могу заполнить/создать MutableExtension с найденным расширением msgB или как создать ExtensionIdentifer msgB для использования в качестве входных данных для создания MutableExtension MsgA?


person rr0711    schedule 23.04.2019    source источник


Ответы (1)


Я думаю, что нашел способ получить расширение в MsgA через отражение.

В объекте MsgA извлеките объект отражения. Затем в объекте отражения вызовите MutableMessage с объектом MsgA и объектом FieldDescriptor расширений (объекты FileDescriptor поступают из GetDescriptor()->file(), в котором определено расширение, в данном случае это MsgB).

MsgA* msgObj;
FieldDescriptor* ext = fileDescriptor->extension(indexOfExtension);
auto reflection = msgObj->GetReflection();
reflection->MutableMessage(msgObj, ext);

Это затем заполнит объект MsgA сообщением расширения, и вы сможете выполнить итерацию по каждому из расширений по индексу, чтобы заполнить объект MsgA каждым сообщением расширения.

person rr0711    schedule 23.04.2019