Java 中没有 class 名称的协议缓冲区反序列化
protocolbuffer de-serialization without the class name in Java
我在文件中有一个序列化原型(sample.dat)。我获得了 jar 文件,其中包含许多 proto 编译文件,这些文件再次编译成 .class 文件。我不知道 sample.dat 中原型的类型或 class。我怎样才能反序列化它?有什么通用的方法吗?
我们在 jar 文件中讨论了多少种原型描述符类型?基本上:你能看看每个描述符类型,看看它是否有效,或者看起来是否正确?
基本上,除非您使用 Any
功能,否则 protobuf 数据不会提及任何对象的类型 - 理想情况下您只需要知道即可。但是,解析原始格式以查看您得到的内容非常容易;您可以使用 protoc
工具使用 --decode_raw
选项来执行此操作,或者通过 https://protogen.marcgravell.com/decode 等工具在线执行此操作。这两种方法都会向您展示它可以关于您的数据的哪些内容,希望您能够根据您看到的结构与以下之一的结构进行比较来弄清楚它看起来像哪种类型:
.proto
文件中的 message
定义
- 源代码中生成的类型
- 库中生成的类型
注意:二进制 protobuf 数据不包括成员名称 - 仅包括字段编号。如果您可以看到生成的源代码或属性元数据,或者 反编译 已编译的库以查看 serialize/deserialize 代码的样子,您可以 手动 通过检查将名称映射到数字 - 以确定类型是否看起来可能。
注意:如果 java 代码包含类型的二进制描述符,编译的描述符数据可以 也 被解码 - 每个应该代表一个 DescriptorProto
来自 descriptor.proto
。这不会帮助您了解根类型是什么,但可能会帮助您了解每种类型,因为它提供了对元数据的完全访问权限。
我在文件中有一个序列化原型(sample.dat)。我获得了 jar 文件,其中包含许多 proto 编译文件,这些文件再次编译成 .class 文件。我不知道 sample.dat 中原型的类型或 class。我怎样才能反序列化它?有什么通用的方法吗?
我们在 jar 文件中讨论了多少种原型描述符类型?基本上:你能看看每个描述符类型,看看它是否有效,或者看起来是否正确?
基本上,除非您使用 Any
功能,否则 protobuf 数据不会提及任何对象的类型 - 理想情况下您只需要知道即可。但是,解析原始格式以查看您得到的内容非常容易;您可以使用 protoc
工具使用 --decode_raw
选项来执行此操作,或者通过 https://protogen.marcgravell.com/decode 等工具在线执行此操作。这两种方法都会向您展示它可以关于您的数据的哪些内容,希望您能够根据您看到的结构与以下之一的结构进行比较来弄清楚它看起来像哪种类型:
.proto
文件中的message
定义- 源代码中生成的类型
- 库中生成的类型
注意:二进制 protobuf 数据不包括成员名称 - 仅包括字段编号。如果您可以看到生成的源代码或属性元数据,或者 反编译 已编译的库以查看 serialize/deserialize 代码的样子,您可以 手动 通过检查将名称映射到数字 - 以确定类型是否看起来可能。
注意:如果 java 代码包含类型的二进制描述符,编译的描述符数据可以 也 被解码 - 每个应该代表一个 DescriptorProto
来自 descriptor.proto
。这不会帮助您了解根类型是什么,但可能会帮助您了解每种类型,因为它提供了对元数据的完全访问权限。