我有生成的反序列化类,并且可以生成示例 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/