0

我正在使用一个非常模块化的系统。消息可以由 src、dest、type 的 3 元组确定。

我正在研究使用协议缓冲区重新实现我们的消息。我已经通读了Protocol buffer polymorphism使用协议缓冲区进行多态性的正确方法是什么?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)
}

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

4

1 回答 1

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
}
于 2013-04-07T08:32:05.800 回答