Я использую 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 является распространенным случаем использования. Как правильно это сделать?