c++ - Protocol Buffer SerializeToArray : How to find which structure has been serialized

标签 c++ protocol-buffers

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

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

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

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

请问有人可以投光吗?

更新:

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

最佳答案

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

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

protobuf系统会确保foobarbaz中只填入其中一个,让你写一个切换这些。

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

关于c++ - Protocol Buffer SerializeToArray : How to find which structure has been serialized,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31079490/

相关文章:

python - 在运行时从 protobuf 文件动态创建 python 类?

c++ - Direct3D 中的纹理映射问题

Scala 中的 Java protobuf

c++ - g++ 和 msvc 中的 std::uniform_int_distribution<int> 范围

c++ - VSS 硬件供应商

c++ - Protocol Buffer 可以序列化 hash_multimap 吗?

c++ - 将 Protobuf 转换为具有类似功能的 ROS 消息

java - 使用 GRPC 流式传输多种类型的最佳方法

c++ - 自定义 QListView 中项目的图标和文本位置的正确方法是什么?

c++ - 深度优先搜索树边分类