【问题标题】:How to deserialize an object of unknown class如何反序列化未知类的对象
【发布时间】:2013-10-16 00:13:36
【问题描述】:

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

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

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

【问题讨论】:

  • 您要反序列化的类是否在类路径中?
  • 如果在类路径中没有对象的类,就无法反序列化对象。对象的类别是什么?如果需要,那么您应该将 JSON 存储在缓存中,而不是序列化的 Java 对象。
  • @JBNizet:完全正确。但是,我认为@tieTYT 正试图找出问题的背景。也许这个要求背后的真正原因是有一些遗留的.ser 文件需要在类路径中不再有类(或该类的那个版本)的情况下进行检查。这需要一种与将对象转换为 JSON 完全不同的方法。
  • @CostiCiudatu:我的评论是针对 OP,而不是针对 tieTYT。 Op 说他想反序列化对象“而不在类路径中加载它的类”,这就是为什么我告诉他这是不可能的。
  • @JBNizet:我现在明白了。好吧,“不可能”有点过分了。不平凡也许是一个更合适的标签......

标签: java json serialization


【解决方案1】:

这个看起来很有希望:https://github.com/unsynchronized/jdeserialize 不过我没试过。

它是对象序列化流的完整实现 协议,如 Java 对象序列化规范中所述, 第 6 章。它没有实例化任何类 溪流;相反,它建立了一个中间表示 类型、实例和值。因此,它可以分析流 无法访问生成它们的类代码。

【讨论】:

  • 它就像一个魅力,打印伪Java中的模式(类定义)和存储在流中的对象实例。
  • 遗憾的是缺少一种从 jdeserialize 表示回到序列化对象的方法。
  • @LiamWilliams 你可能错了,jdesiarialize 依赖于 ObjectOutputStream。他们文档的第一句话说:“jdeserialize 是一个解释 Java 序列化对象的库——由 ObjectOutputStream 生成的数据”
  • 你的评论有错字吗?
  • (您突出显示的引用位表明它知道如何将 ObjectOutputStream 输出的字节读取到 jdeserialize 表示中,但不知道如何从该表示返回到 ObjectOutputStream)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 2014-03-27
  • 2021-03-09
相关资源
最近更新 更多