Установите oneof в сообщении protobuf, используя отражение - PullRequest
0 голосов
/ 10 мая 2018

Через несколько часов я все еще не могу установить поле oneof в чистом (только что созданном) сообщении protobuf, используя отражение в c ++.

Я могу получить необходимый OneOfDescriptor через дескриптор сообщения.Но когда я попытался «установить» одно из них, используя Reflection , я обнаружил реальную проблему.Существует только три члена-функции, связанных с OneOfDescriptor :

  • HasOneOf , чтобы проверить, существует ли ранее определенное oneof в сообщении
  • GetOneofFieldDescriptor для получения FieldDescriptor из предыдущего определенного oneof в сообщении
  • ClearOneof (без документации) для очистки oneof.

Таким образом, SetOneofFieldDescriptor не существует, и если oneof в сообщении не было определено ранее, с использованием элемента функции mutable_XXXX в сообщении, GetOneofFieldDescriptor возвращает nullptr.

Поэтому я действительно застрял, и любая идея будет приветствоваться.

Заранее спасибо.

1 Ответ

0 голосов
/ 10 мая 2018

Вы устанавливаете его так же, как и поле, если оно не было частью oneof.Получите FieldDescriptor из сообщения Descriptor и передайте его соответствующему SetXXX методу сообщения Reflection.

. Получив сообщение, подобное следующему:

message Foo
{
    oneof bar
    {
        int32 a = 1;
        string b = 2;
    }
}

Вы можете установить элемент a следующим образом:

#include "foo.pb.h"

int main()
{
    Foo f;
    const google::protobuf::Descriptor* d = f.GetDescriptor();
    const google::protobuf::FieldDescriptor* a = d->FindFieldByName("a");

    const google::protobuf::Reflection* r = f.GetReflection();
    r->SetInt32(&f, a, 42);
}

Protobuf позаботится о том, чтобы все ранее установленные элементы oneof были сброшены при необходимости.

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