协议缓冲区SerializeToArray:如何查找已序列化的结构

时间:2015-06-26 18:06:17

标签: c++ protocol-buffers

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

但是,如果涉及多个结构,并且我必须将它们中的任何一个发送到另一端。我不知道在另一端我应该找出哪个结构被序列化了? (所以我可以将其ParseFromArray称为获取值)

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

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

请有人投光吗?

更新

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

2 个答案:

答案 0 :(得分:1)

最好的办法是使用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()等。

答案 1 :(得分:0)

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

你可以:

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