Protocol buffer SerializeToArray:如何查找已序列化的结构

Protocol buffer SerializeToArray: How to find which structure has been serialized

我正在使用 ProtoBuf 使用结构在客户端和服务器之间进行通信。我调用 SerializeToArray 然后通过线路发送获得的缓冲区,并在另一端调用相同结构的 ParseFromArray 方法来取回结构中的值。它按预期工作。

但是,如果涉及多个结构并且我必须将它们中的任何一个发送到另一端。我不确定在另一端如何找出哪个结构已被序列化? (所以我可以调用它的 ParseFromArray 来获取值)

我能想到的解决此问题的一种方法是将所有结构保持为 "ID Byte"。因此,当任何结构在缓冲区中被序列化时,我总是可以读取缓冲区的第一个字节以找到它是哪个结构。

但我不确定这是否是标准的做法,以及它是否适用于所有平台。

请问有人可以投光吗?

更新:

感谢 Kenton Varda 的提示。我决定使用 Oneof 功能来实现这一点。

由于 ProtoBuf 消息不是自我描述的,因此您需要指定要序列化的消息类型。

您可以:

  1. 第一个字节表示消息
  2. 以已知消息顺序的方式设置您的协议(例如,收到请求,必须发送回复)

最好的办法是使用 Protobuf's oneof declaration 定义外包装类型,例如:

message MyMessage {
  oneof value {
    Foo foo = 1;
    Bar bar = 2;
    Baz baz = 3;
  }
}

protobuf 系统将确保只填写 foobarbaz 之一,并让您在这些上写一个 switch

请注意,此功能是 2.6 版中的新增功能,第三方 Protobuf 实现可能尚未更新以支持它。然而,在这些第三方实现中,声明应该表现得像一组 optional 字段,仍然可用;只是您需要一系列 if/else 语句来检查 has_foo()has_bar()