我正在使用protobuf在消息队列中发送不同类型的对象。假设我有两种类型的对象,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
的{{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中发送不同类型的对象是常见的用例。正确的做法是什么?