我正在使用极其模块化的系统。消息可以通过src,dest,type的3元组来确定。
我正在考虑使用Protocol Buffers重新实现我们的消息。我通读了Protocol buffer polymorphism,what's the right way to do polymorphism with protocol buffers?和http://www.indelible.org/ink/protobuf-polymorphism/
我想知道有没有人实施解决方案:
message header {
required string src = 1
required string dest = 2
required string type = 3
}
创建单独的消息,其中:
message foo {
required header h = 1
required string a = 2
}
单独的文件:
message bar {
required header h = 1
required uint32 num = 2
}
在接收代码中有类似的内容:
Message.ParseFromString(msgStr)
if (Message.type == foo)
{
FooMessage.ParseFromString(msgStr)
}
else {
BarMessage.ParseFromString(msgStr)
}
如果使用这种方法,它是否比上述链接中描述的更好或更差?
答案 0 :(得分:2)
我发现的唯一方法是将消息体序列化/反序列化为字节数组。然后你将获得所需的抽象级别:
message header {
required string src = 1;
required string dest = 2;
required string type = 3;
}
message foo {
required string a = 2;
}
message bar {
required uint32 num = 2;
}
message request {
required header h;
required bytes data; // serialize foo or bar here
}
然后你的代码就像那样(这是一个伪代码):
request req = request.ParseFromString(buffer);
if (req.h().type() == "foo") {
foo msg = foo.ParseFromString(req.data);
// process foo msg
}
else if (req.h().type() == "bar") {
bar msg = bar.ParseFromString(req.data);
// process bar msg
}