我有生成的反序列化类,可以生成样本protobufs(字节缓冲区(。但是我没有.proto
文件。我需要停止使用这些生成的类,因为它们来自可能不受支持且不可用的第三方库。如何自己解析字节缓冲区?
我考虑过:
- 通过
- 生成大量缓冲区并对其进行分析
- 可能带有调试器和第三方类
- 反向编译Java类以获得一些(丑陋的(源代码(但重构自动生成的代码似乎是个坏主意(
- 从类文件生成
.proto
文件(不确定是否可能( - 在没有
.proto
文件和自动生成的代码的情况下,通用地读取protobufs,但我不确定缓冲区是否有足够的嵌入元数据来实现这一点
如何做到这一点?
协议缓冲区带有一些非常强大的反射。看看这里的消息描述符。
消息描述符包含有关特定消息类型的所有信息,因此您应该能够从中找出所有可能的字段。您可以使用直接从原型消息中获取描述符
your_proto_message.getDescriptorForType()
或使用
ProtoMessageClass.getDescriptor()
如果你只需要.proto文件表示,那么你可以在描述符上调用.toProto()
。点击此处了解更多信息。
综上所述:
ProtoMessageClass.getDescriptor().toProto().toString()