如何反序列化未知类的对象

时间:2013-10-08 21:07:22

标签: java json serialization

我需要打印序列化Java对象的内容(例如从缓存中检索到的java.io.Serializable POJO),而不必先验地知道它的类。

更具体一点,我不需要使用经典的ObjectInputStream来实例化一个新对象,我只需要获取对象的简单的人类可读表示(最好是JSON),而不需要在类路径中加载它的类。

换句话说,我需要将byte [](原始序列化对象)转换为JSON字符串,而无需重新实现ObjectInputStream。

2 个答案:

答案 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