C ++ google protobuf: как создать MutableExtension из расширения FieldDescriptor - PullRequest
0 голосов
/ 23 апреля 2019

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

message MsgA
{
    extensions 10 to 50;
}

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

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

С помощью кода protobuf я могу получить дескриптор и FileDescriptor для 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?

1 Ответ

0 голосов
/ 23 апреля 2019

Я думаю, что нашел способ получить расширение в 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 каждым сообщением расширения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...