protobuf для сериализации различных типов сообщений - PullRequest
0 голосов
/ 07 марта 2019

Я использую protobuf для отправки различных типов объектов в очередь сообщений. Скажем, у меня есть 2 типа объектов, Person и Dog.

message Person
{
     optional Type type = 1
     optional string firstName = 2
     optional string lastName = 3
     optional int IQ = 4
}

message Dog
{
     optional Type type = 1
     optional string breed = 2
}

enum Type
{
     person = 1;
     dog = 2;
}

.proto для Person и Dog очевидно различны. Когда я сериализую его, я просто звоню SerializeAsString (или SerializeAsArray) и отправляю его.

Как получатель, я понятия не имею, какой тип я получаю, поэтому я не могу просто позвонить parseFromString(). У меня есть решение, но оно мне не нравится. Мне интересно, как будет выглядеть лучшее решение.

Мое решение требует, чтобы первое поле как Person, так и Dog было Type. Поэтому я десериализирую тип, вижу, что это такое, и затем вызываю соответствующий parseFromString для этого объекта.

Сначала мне нужно добавить Type в мой .proto

message Type
{
    optional Type type = 1
}

Затем в коде получателя я делаю это

void receive(string msg)
{
     Type type;
     type.ParseFromStromg(msg)

     // if this is a person
     if (type.type() == Type::person)
     {
          Person person;
          person.parseFromString(msg);
     }

     // if this is a dog
     if (type.type() == Type::dog)
     {
         Dog dog;
         dog.parseFromString(msg);
     }
}

Мне не нравится это по той основной причине, что мне нужно позвонить parseFromString дважды. parseFromString медленно, поэтому я бы предпочел сделать это только один раз.

Я уверен, что отправка различных типов объектов в protobuf является распространенным случаем использования. Как правильно это сделать?

...