【问题标题】:Can I DeSerialize a java serialized object to different classes?我可以将 java 序列化对象反序列化到不同的类吗?
【发布时间】:2016-09-13 20:41:48
【问题描述】:

不确定如何提出问题。这是一个尝试:

我有两个 aerospike 缓存(组),比如 X、Y。

一个 jar 有两个版本,每个版本都有一个类 com.xyz.MyClass

jar1:

com.xyz.MyClass{
    com.abc.Request request;
    ...
}

jar2:

com.xyz.MyClass{
    com.pqr.Request request;
    ...
}

现在来自 jar1 的 MyClass 的一些对象存储在缓存 X 和 jar2 中 MyClass 的一些对象存储在缓存 Y 中。

我想反序列化两个缓存中的数据,执行一些计算并存储在数据库中。

我无法序列化,因为两个 jar 中 MyClass 的完全限定名称相同。

我将删除其中一个缓存(但这需要一些时间)。 所以,希望暂时解决这个问题。

我能以一种好的方式处理这个问题吗?

也许反序列化为中介(不关心包,只关心类结构),然后到 MyClass。

注意:两个类的结构相同,只是成员变量的包名不同。

附: : 不想使用多个类加载器。

【问题讨论】:

  • 某种注释处理器怎么样?
  • 这种问题就是为什么存储序列化对象是个坏主意。
  • @j.seashell : 你能发布一些代码来解释你的建议吗?

标签: java json caching serialization jackson


【解决方案1】:

实现它需要大量的魔法,并且禁止类加载器魔法会删除你一半的选择。

我可以提出的解决方案是编辑序列化数据。序列化对象的格式是已知的,并且是 Java 规范的一部分。因此,您可以编辑此字节以将一个类名替换为另一个,但我建议您在开始实施之前三思而后行。这可能不是那么简单的任务。

【讨论】:

  • 我认为我可以从两个类的结构相同的事实中受益。也许这可以工作:java反序列化为hashmap,然后使用jaskson序列化hashmap并从任一罐子反序列化为一个类。 (假设 jaskson 不关心包信息,只关心结构。)。如果可行,将尝试发布。
  • 你需要实现“java反序列化为hashmap”。没有图书馆(AFAIK)可以帮助您。需要你自己实现。
【解决方案2】:

生成两个不同的serialVersionUID,并在每个类中使用它们。

private static final long serialVersionUID = -7000188057019447678L;// Add this in MyClass of jar1

private static final long serialVersionUID = -3944128180162145709L;// Add this in MyClass of jar2

您可以使用 Eclipse IDEJDK 的 serialver 工具 生成自己的 serialVersionUID。

注意:如果没有声明serialVersionUID,JVM会使用自己的算法生成一个默认的SerialVersionUID。 可以查看算法here.

默认的serialVersionUID计算对类细节高度敏感,可能会因不同的JVM实现而异,并在反序列化过程中导致意外的InvalidClassExceptions。

【讨论】:

  • 它将如何提供帮助?它只是告诉反序列化器它是错误的类,反序列化器将抛出异常。
  • 因为这两个类都使用了不同的serialVersionUID。 jar1 的对象使用 serialVersionUID = -7000188057019447678L 进行序列化,jar2 的对象使用 serialVersionUID = -3944128180162145709L 进行序列化。在反序列化的时候,反序列化器会使用serialVersionUID识别jar1&jar2的对象。
  • 很遗憾,但它不是那样工作的。您可以在这里查看详细信息:stackoverflow.com/questions/285793/…
猜你喜欢
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 2015-11-14
  • 2013-07-22
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
  • 2018-06-21
相关资源
最近更新 更多