如何动态分配正确的消息以解码协议缓冲区消息?

时间:2018-10-12 16:32:19

标签: ruby-on-rails ruby protocol-buffers proto3

嗨,我有一个处理“事件”的数据流管道。这些事件是简单的协议缓冲区消息,例如:

message OrderCoffee {
    int32 id = 1;
}

message CancelOrder {
    int32 id = 1;
}

然后,客户端对这些消息进行序列化/编码,并将其推送到消息代理中(例如Google Pub/Sub)。订户使用一条消息并尝试对其进行解码/反序列化(伪代码):

decoded_message = OrderCoffe.decode(encoded_message)
decoded_message = CancelOrder.decode(encoded_message)

其中哪些行有效?两者,至少在我的Ruby代码中。我不知道我是否对使用协议缓冲区有概念上的误解,或者这是一个红宝石错误。

如果这是预期的行为,我如何在运行时知道我应该解码收到的消息?

编辑:

好的,解决方案似乎是https://developers.google.com/protocol-buffers/docs/techniques?csw=1#self-description

我听不懂。有人可以举例说明如何在ruby中实现它吗?

1 个答案:

答案 0 :(得分:2)

基本上,您不能从那里。 Protobuf消息不是自描述的。如果是我,我要添加一个包装器:

message SomeType {
    oneof the_thing {
        OrderCoffee order = 1;
        CancelOrder cancel = 2;
    }
}

反序列化the_thing时,可以测试分配了哪个内部对象。