java - 如何在没有 proto 文件的情况下反序列化 protobuf?

标签 java protocol-buffers

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

我考虑过:

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

如何做到这一点?

最佳答案

Protocol Buffer 带有一些非常强大的反射。看一下消息描述符here .

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

your_proto_message.getDescriptorForType()

或者使用

ProtoMessageClass.getDescriptor()

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

所以,总结一下:

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

关于java - 如何在没有 proto 文件的情况下反序列化 protobuf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53084006/

相关文章:

java - 使用逗号分隔值但保留括号内使用的逗号的正则表达式模式

java - Proto Generated 类的 toString 导致异常

go - gRPC 流中的错误类型

java - 通过套接字发送压缩的 JPG 图像

java - 在 Magnolia cms Blossom 中配置 fckconfig.js

java - 一起使用 BufferedReader 和 InputStream

java - 使用 protobuf 写入数据的最佳实践

php - python:在拦截器中读取grpc proto请求

dart - 自动生成protobuf注释的类

java - 在生产与开发中使用特定的 xml 文件