gpt4 book ai didi

java - 如果对象被移动到另一个包或重命名,我该如何反序列化该对象?

转载 作者:太空宇宙 更新时间:2023-11-04 10:27:39 24 4
gpt4 key购买 nike

考虑以下情况:

有一个由旧版本的应用程序创建的序列化文件。不幸的是,该类的包已更改,已序列化。现在我需要将该文件中的信息加载到同一个类中,但位于不同的包中。该类已定义 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;
}
}

这还允许人们忽略serialVersionUIDs不匹配,甚至在类的字段结构发生更改时反序列化该类。

关于java - 如果对象被移动到另一个包或重命名,我该如何反序列化该对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50362302/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com