protobuf序列化不同类型的消息

时间:2019-03-07 14:58:59

标签: c++ serialization protocol-buffers

我正在使用protobuf在消息队列中发送不同类型的对象。假设我有两种类型的对象,PersonDog

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;
}

.protoPerson的{​​{1}}明显不同。序列化时,我只调用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的运行速度很慢,所以我宁愿只做一次。

我确定在protobuf中发送不同类型的对象是常见的用例。正确的做法是什么?

0 个答案:

没有答案