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

Posted

技术标签:

【中文标题】如何动态分配正确的消息来解码协议缓冲区消息?【英文标题】:How dynamically assign correct message to decode protocol buffer message? 【发布时间】:2018-10-12 16:32:18 【问题描述】:

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

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 代码中。我不知道我是否对如何使用协议缓冲区有概念上的误解,或者那是一个 ruby​​ 错误。

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

编辑:

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

虽然我无法理解。有人可以提供一个如何在 ruby​​ 中实现它的示例吗?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于如何动态分配正确的消息来解码协议缓冲区消息?的主要内容,如果未能解决你的问题,请参考以下文章

在数据流管道中动态设置 bigquery 表 id

添加新消息后的 Proto2 编码/解码问题

Leetcode No.91 解码方法(动态规划)

Leetcode No.91 解码方法(动态规划)

讨论:动态链接库如何给主程序发送自定义消息?

有没有其他半/便携的方式来动态分配内存?