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

Protocol buffers 确定协议缓冲区消息类型的最佳实践,protocol-buffers,Protocol Buffers,我需要序列化和反序列化与字节流之间的协议缓冲区消息序列。有几种预先确定的消息类型。建议采用何种方式对类型信息进行编码,以便我的应用程序能够知道它应该读取哪种类型?我的建议没有特定顺序: 包括一个包含proto名称/id的字段(并在所有proto的示例1中为其提供相同的字段号) 使用(在页面底部)。在这种情况下,你可以 将作为字段包含(在消息中) 在java(和其他一些实现)中,您可以将FileDescriptor集作为分隔文件中的第一条消息写入 保持原型名称较小,并在文件名中使用原型名称,例

我需要序列化和反序列化与字节流之间的协议缓冲区消息序列。有几种预先确定的消息类型。建议采用何种方式对类型信息进行编码,以便我的应用程序能够知道它应该读取哪种类型?

我的建议没有特定顺序:

  • 包括一个包含proto名称/id的字段(并在所有proto的示例1中为其提供相同的字段号)
  • 使用(在页面底部)。在这种情况下,你可以

    • 将作为字段包含(在消息中)
    • 在java(和其他一些实现)中,您可以将FileDescriptor集作为分隔文件中的第一条消息写入
  • 保持原型名称较小,并在文件名中使用原型名称,例如

    salesProto_Store001.bin

    这有几点好处:

    • 很明显,文件格式是什么
    • 您可以扫描shell脚本以查找proto的使用位置
    • 这种技术可以单独使用,也可以与上述2种技术结合使用
    • 此技术可用于任何基于模式的文件(例如Cobol)
  • 最后

    • 支持自我描述消息,其中

      • 文件描述符是分隔文件中的第一条消息
      • 消息中的第一个字段
    • 具有搜索功能,可尝试将Protobuf消息中的字段与已知的Proto definition文件进行匹配,并提供可能的匹配信息


    背景: 若您不知道,协议缓冲区协议文件可以转换为协议缓冲区消息 储存

    自我描述信息w:

    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;
    }
    

    最常见的方法是使用

    例如:

    message AnyMessage {
        optional Message1 msg1 = 1;
        optional Message2 msg2 = 2;
        ...
    }
    
    然后在
    AnyMessage
    容器中对所有消息进行编码/解码。从protobuf 2.6开始,您还可以使用
    oneof
    说明符,该说明符将确保只设置一个子消息。

    协议缓冲区是序列化的结构化数据。您能解释一下为什么您认为需要对序列化数据进行编码吗?