Protocol buffer SerializeToArray:如何查找已序列化的结构
Protocol buffer SerializeToArray: How to find which structure has been serialized
我正在使用 ProtoBuf 使用结构在客户端和服务器之间进行通信。我调用 SerializeToArray
然后通过线路发送获得的缓冲区,并在另一端调用相同结构的 ParseFromArray
方法来取回结构中的值。它按预期工作。
但是,如果涉及多个结构并且我必须将它们中的任何一个发送到另一端。我不确定在另一端如何找出哪个结构已被序列化? (所以我可以调用它的 ParseFromArray
来获取值)
我能想到的解决此问题的一种方法是将所有结构保持为 "ID Byte"。因此,当任何结构在缓冲区中被序列化时,我总是可以读取缓冲区的第一个字节以找到它是哪个结构。
但我不确定这是否是标准的做法,以及它是否适用于所有平台。
请问有人可以投光吗?
更新:
感谢 Kenton Varda 的提示。我决定使用 Oneof
功能来实现这一点。
由于 ProtoBuf 消息不是自我描述的,因此您需要指定要序列化的消息类型。
您可以:
- 第一个字节表示消息
- 以已知消息顺序的方式设置您的协议(例如,收到请求,必须发送回复)
最好的办法是使用 Protobuf's oneof
declaration 定义外包装类型,例如:
message MyMessage {
oneof value {
Foo foo = 1;
Bar bar = 2;
Baz baz = 3;
}
}
protobuf 系统将确保只填写 foo
、bar
或 baz
之一,并让您在这些上写一个 switch
。
请注意,此功能是 2.6 版中的新增功能,第三方 Protobuf 实现可能尚未更新以支持它。然而,在这些第三方实现中,声明应该表现得像一组 optional
字段,仍然可用;只是您需要一系列 if
/else
语句来检查 has_foo()
、has_bar()
等
我正在使用 ProtoBuf 使用结构在客户端和服务器之间进行通信。我调用 SerializeToArray
然后通过线路发送获得的缓冲区,并在另一端调用相同结构的 ParseFromArray
方法来取回结构中的值。它按预期工作。
但是,如果涉及多个结构并且我必须将它们中的任何一个发送到另一端。我不确定在另一端如何找出哪个结构已被序列化? (所以我可以调用它的 ParseFromArray
来获取值)
我能想到的解决此问题的一种方法是将所有结构保持为 "ID Byte"。因此,当任何结构在缓冲区中被序列化时,我总是可以读取缓冲区的第一个字节以找到它是哪个结构。
但我不确定这是否是标准的做法,以及它是否适用于所有平台。
请问有人可以投光吗?
更新:
感谢 Kenton Varda 的提示。我决定使用 Oneof
功能来实现这一点。
由于 ProtoBuf 消息不是自我描述的,因此您需要指定要序列化的消息类型。
您可以:
- 第一个字节表示消息
- 以已知消息顺序的方式设置您的协议(例如,收到请求,必须发送回复)
最好的办法是使用 Protobuf's oneof
declaration 定义外包装类型,例如:
message MyMessage {
oneof value {
Foo foo = 1;
Bar bar = 2;
Baz baz = 3;
}
}
protobuf 系统将确保只填写 foo
、bar
或 baz
之一,并让您在这些上写一个 switch
。
请注意,此功能是 2.6 版中的新增功能,第三方 Protobuf 实现可能尚未更新以支持它。然而,在这些第三方实现中,声明应该表现得像一组 optional
字段,仍然可用;只是您需要一系列 if
/else
语句来检查 has_foo()
、has_bar()
等