如何动态分配正确的消息来解码协议缓冲区消息?
How dynamically assign correct message to decode protocol buffer message?
您好,我有一个在 "events" 上运行的数据流管道。这些事件是简单的协议缓冲区消息,例如:
message OrderCoffee {
int32 id = 1;
}
message CancelOrder {
int32 id = 1;
}
客户端然后 serialize/encode 这些消息并将它们推送到消息代理(比如 Google Pub/Sub
)。订阅者消费一条消息并尝试 decode/deserialize(伪代码):
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 中实现它的示例吗?
基本上,你不能从那里。 Protobuf 消息不是自描述的。如果是我,我会添加一个包装器:
message SomeType {
oneof the_thing {
OrderCoffee order = 1;
CancelOrder cancel = 2;
}
}
反序列化 the_thing
时,您可以测试分配了哪个内部对象。
您好,我有一个在 "events" 上运行的数据流管道。这些事件是简单的协议缓冲区消息,例如:
message OrderCoffee {
int32 id = 1;
}
message CancelOrder {
int32 id = 1;
}
客户端然后 serialize/encode 这些消息并将它们推送到消息代理(比如 Google Pub/Sub
)。订阅者消费一条消息并尝试 decode/deserialize(伪代码):
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 中实现它的示例吗?
基本上,你不能从那里。 Protobuf 消息不是自描述的。如果是我,我会添加一个包装器:
message SomeType {
oneof the_thing {
OrderCoffee order = 1;
CancelOrder cancel = 2;
}
}
反序列化 the_thing
时,您可以测试分配了哪个内部对象。