【问题标题】:Is there an alternative to Protobuf that can map serialized messages to its type?是否有可以将序列化消息映射到其类型的 Protobuf 替代方案?
【发布时间】:2021-12-28 18:17:10
【问题描述】:

得知 Protobuf 无法反序列化并将消息映射到它被序列化的类型时,我感到很失望:protobuf determining message type to deserialize

例如,当通过单个套接字连接发送消息时,我们可能希望根据消息类型路由消息。

有没有序列化方案可以做到这一点?

【问题讨论】:

  • 您引用的答案是正确的,但您的推断不正确。您不能反序列化任意 protobuf 消息。那是对的。但是您可以对封装任意消息的已知标准消息类型的消息进行反序列化。见Any。我认为这条评论可能不会改变你的决定,但它确实提供了一种可能的方法。
  • 偶然发现:Protocol Buffers self-describing messages
  • 我所有的应用程序都将拥有 proto 文件的最新副本,但自描述消息技术仍然很有趣。
  • 感谢您提供的信息。我发现Any 文档有点稀疏和深奥,所以如果我错了请纠正我,但我可以将整个 Protobuf 消息放在另一个通用 Protobuf 消息的Any 字段中,称之为AppMessage,并且把那个送过去?由此引发了几个问题 - 1) 接收者能否分辨出具有相同字段的两条消息之间的区别?还是我需要为每个Any 字段指定消息类型? 2)我是否需要一个长的 switch/case 语句来测试我期望收到的每一种消息(我认为 Protobuf 可以帮助我避免这种情况)?
  • 查看Any的protobuf定义。该消息包含type_urlbytestype_url 用于提供对bytes 消息类型的唯一引用。是的,无论您如何实现这一点,您都需要对所有传入消息类型的可能性进行模式匹配。

标签: serialization deserialization protocol-buffers


【解决方案1】:

事实证明,Protobuf 确实以一种迂回的方式支持这种用法。 DazWilkin 在 cmets 中关于 Any 的回答为我指明了正确的方向。

Any 是一种 Google 类型,您可以将其包含在自定义 Protobuf 消息中,例如 WrapperMessage

message WrapperMessage {
  google.protobuf.Any anyMessage = 1;
}

您可以将其他自定义 Protobuf 消息打包和解包到 Any。解包Any消息时,根据客户端的Protobuf库,会有一些方法可以访问表示类型的字符串,通常是typeUrl,但有些实现允许访问fullName

从那里您应该拥有打开此类型字符串并将Any 转换为所需的特定 Protobuf 自定义消息类型所需的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多