确定协议缓冲区消息类型的最佳实践

时间:2014-09-25 21:59:01

标签: protocol-buffers

我需要对字节流中的一系列协议缓冲区消息进行序列化和反序列化。有一些预定的消息类型。编码类型信息的推荐方法是什么,以便我的应用程序可以知道它应该读取哪种类型?

2 个答案:

答案 0 :(得分:7)

最常见的方法是使用union message

例如:

message AnyMessage {
    optional Message1 msg1 = 1;
    optional Message2 msg2 = 2;
    ...
}

然后在AnyMessage容器内对所有消息进行编码/解码。从protobuf 2.6开始,您还可以使用oneof说明符,这将确保只设置其中一个子消息。

答案 1 :(得分:1)

我的建议没有特别的顺序:

  1. 包含一个包含原型名称/ id的字段(并在所有原型中给出相同的字段编号,例如1)
  2. 使用self describing message(位于页面底部)。在这种情况下,你可以

    • FileDescriptorSet作为字段(在您的消息中)
    • 在java(以及其他一些实现)中,您可以将FileDescriptor设置为分隔文件中的第一条消息。
  3. 保持原型名称较小,并在文件名中使用原型名称,例如

    <强> salesProto_Store001.bin

    这有几点好处:

    • 显而易见的是文件格式
    • 您可以扫描shell脚本以查找原型的使用位置。
    • 此技术可单独使用或与上述2结合使用。
    • 此技术可用于任何基于模式的文件(例如Cobol)。
  4. 最后是ProtobufEditor

    • 支持自我描述消息

      • 文件描述符是分隔文件中的第一条消息
      • 消息中的第一个字段
    • 有一个搜索功能,它会尝试匹配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;
    }