我需要打印序列化Java对象的内容(例如从缓存中检索到的java.io.Serializable POJO),而不必先验地知道它的类。
更具体一点,我不需要使用经典的ObjectInputStream来实例化一个新对象,我只需要获取对象的简单的人类可读表示(最好是JSON),而不需要在类路径中加载它的类。
换句话说,我需要将byte [](原始序列化对象)转换为JSON字符串,而无需重新实现ObjectInputStream。
答案 0 :(得分:5)
这个很有希望:https://github.com/unsynchronized/jdeserialize 我没试过。
它是对象序列化流的完整实现 协议,如Java对象序列化规范中所述, 第6章它没有实例化中描述的任何类 流;相反,它建立了一个中间表示 类型,实例和值。因此,它可以分析流 无法访问生成它们的类代码。
答案 1 :(得分:2)
简短的回答是 no 。您或多或少会最终重新实现ObjectInputStream
功能,因为Java序列化是一种专有格式,您必须实现读取该格式的规范。
然而,在某种程度上,它应该比阅读其他二进制格式更困难;但你需要记住,二进制格式可以很容易阅读(bson,avro或者protobuf)或非常具有挑战性(如PDF或Excel)。我会将java序列化格式置于介于两者之间的某个位置,但更接近于简单格式。
难点在于,您可能必须在读取其值时猜测字段类型(ObjectInputStream
具有来自类定义的信息;因此对原始字体进行一些引用会非常有帮助即使您不使用ObjectInputStream
,也可以在类路径中使用类。或者,如果您可以以不同的方式提供元数据,则问题就解决了。
更新: 写完上述令人沮丧的答案后,我发现了这个有用的问题:https://stackoverflow.com/questions/181448/gui-tool-to-browse-java-serialized-objects