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

标签 java serialization

考虑以下情况:

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

相关文章:

python - 使用 Python 进行简单的 JSON 编码

java - 编程新手。构建简单的银行应用程序 - token ";"上存在语法错误,{预期。 - Eclipse 中的错误(包含代码)

java - 如何在eclipse中将项目添加到svn?

java - TextButton isPressed() 不起作用

java - 无法通过 ToolProvider 找到 jpackage

Java JComboBox 不显示

c# - 使用不带属性的 Newtonsoft.Json 序列化和反序列化自定义类型

Java:(部分)类的序列化(不是对象!)

serialization - "Serialize"VHDL 记录

java - 用于 map 序列化的 Jackson 模块