使用Google协议缓冲区多次反序列化邮件

时间:2013-04-05 00:41:48

标签: polymorphism protocol-buffers message-passing

我正在使用极其模块化的系统。消息可以通过src,dest,type的3元组来确定。

我正在考虑使用Protocol Buffers重新实现我们的消息。我通读了Protocol buffer polymorphismwhat'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)
}

如果使用这种方法,它是否比上述链接中描述的更好或更差?

1 个答案:

答案 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
}