我可以将java序列化对象反序列化为不同的类吗?

我可以将java序列化对象反序列化为不同的类吗?,java,json,caching,serialization,jackson,Java,Json,Caching,Serialization,Jackson,不确定如何界定问题。下面是一个尝试: 我有两套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的一些对象存储在缓存

不确定如何界定问题。下面是一个尝试:

我有两套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

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


注意:不要使用多个类加载器。

这需要大量的魔法才能实现,而禁用类加载器魔法将删除一半的选项


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

生成两个不同的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
您可以使用EclipseIDEJDK的serialver工具生成自己的serialVersionUID

注意:如果未声明serialVersionUID,JVM将使用自己的算法生成默认serialVersionUID。 你可以检查算法


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

某种注释处理器如何?这类问题就是为什么存储序列化对象不是个好主意。@j.seashell:您能发布一些代码解释您的建议吗?我想我可以从这两种处理器的结构中获益课程是一样的。也许这是可行的:java反序列化为hashmap,然后使用jaskson序列化hashmap,并从任一JAR反序列化为类。(假设jaskson不关心包信息,只关心结构。)。如果可以的话,我将尝试发布。您需要实现“java反序列化到hashmap”。没有一个图书馆(AFAIK)能帮你解决这个问题。你需要自己去实现它。它会有什么帮助?它只是告诉反序列化程序它是错误的类,反序列化程序将抛出异常。因为,两个类使用不同的serialVersionUID。jar1的对象序列化为serialVersionUID=-7000188057019447678L,jar2的对象序列化为serialVersionUID=-3944128180162145709L。在反序列化时,反序列化程序将使用serialVersionUID识别jar1和jar2的对象。很遗憾,它不是这样工作的。您可以在此处查看详细信息: