考虑以下情况:
有一个序列化文件,由旧版本的应用程序创建。不幸的是,已序列化的类的包已更改。现在我需要将此文件中的信息加载到同一个类中,但位于不同的包中。此类已定义 serialVersionUID
且未更改(即兼容)。
问题:是否可以使用任何技巧从这个文件加载新的类实例(除了将类复制到旧包中然后使用反序列化包装器逻辑)?可以使用readResolve()
从移动/重命名类(class)中恢复?如果不是,请解释原因。
最佳答案
有可能:
class HackedObjectInputStream extends ObjectInputStream {
public HackedObjectInputStream(InputStream in) throws IOException {
super(in);
}
@Override
protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException {
ObjectStreamClass resultClassDescriptor = super.readClassDescriptor();
if (resultClassDescriptor.getName().equals("oldpackage.Clazz"))
resultClassDescriptor = ObjectStreamClass.lookup(newpackage.Clazz.class);
return resultClassDescriptor;
}
}
这也允许人们忽略 serialVersionUID 不匹配,甚至在其字段结构发生更改时反序列化一个类。
关于java - 如果对象被移动到另一个包或重命名,我该如何反序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2358886/