没有proto文件,如何反序列化protobuf?

时间:2018-10-31 13:02:09

标签: java protocol-buffers

我具有生成的反序列化类,并且可以生成示例protobuf(字节缓冲区)。但是我没有.proto文件。我需要停止使用这些生成的类,因为它们来自第三方库,这些库可能不受支持并且不可用。我如何自己解析字节缓冲区?

我认为:

  • 通过以下方式对二进制格式进行逆向工程
    • 生成大量缓冲区并进行分析
    • 可能带有 调试器和第三方类
    • 反向编译Java类以获得一些(难看的)源代码(但是重构自动生成的代码似乎是个坏主意)。
  • 从类文件生成.proto文件(不确定是否可行)
  • 通常在没有.proto文件且没有自动生成的代码的情况下读取protobuf,但是我不确定缓冲区是否具有足够的嵌入式元数据。

这怎么办?

1 个答案:

答案 0 :(得分:1)

协议缓冲区带有一些非常强大的反映。看一下消息描述符here

消息描述符包含有关特定消息类型的所有信息,因此您应该能够从那里找出所有可能的字段。您可以使用以下方法直接从原始消息中获取描述符:

your_proto_message.getDescriptorForType()

或使用

ProtoMessageClass.getDescriptor()

如果只需要.proto文件表示形式,则只需在描述符上调用.toProto()。更多信息here

所以,总结一下:

ProtoMessageClass.getDescriptor().toProto().toString()