我需要对字节流中的一系列协议缓冲区消息进行序列化和反序列化。有一些预定的消息类型。编码类型信息的推荐方法是什么,以便我的应用程序可以知道它应该读取哪种类型?
答案 0 :(得分:7)
最常见的方法是使用union message。
例如:
message AnyMessage {
optional Message1 msg1 = 1;
optional Message2 msg2 = 2;
...
}
然后在AnyMessage
容器内对所有消息进行编码/解码。从protobuf 2.6开始,您还可以使用oneof
说明符,这将确保只设置其中一个子消息。
答案 1 :(得分:1)
我的建议没有特别的顺序:
使用self describing message(位于页面底部)。在这种情况下,你可以
保持原型名称较小,并在文件名中使用原型名称,例如
<强> salesProto_Store001.bin 强>
这有几点好处:
支持自我描述消息
有一个搜索功能,它会尝试匹配Protobuf消息中的字段与已知的原型定义文件,并为您提供可能的比赛
<强>背景强> 如果您不知道,协议缓冲区proto文件可以转换为FileDescriptorSet协议缓冲区消息 <存储
自我描述信息:
message SelfDescribingMessage {
// Set of .proto files which define the type.
required FileDescriptorSet proto_files = 1;
// Name of the message type. Must be defined by one of the files in
// proto_files.
required string type_name = 2;
// The message data.
required bytes message_data = 3;
}