将过时的存储类转换为更新的类

时间:2014-10-26 22:30:20

标签: java class

我遇到了课程问题。我将数据作为Java对象存储在Serializable类中,而不是在某些地方作为一系列变量存储。但是,当我对相关类进行更改时,Java会立即抛出错误。

例如,这是一个旧类:

class Demo implements Serializable{
    private int a; private int b; int c;
    public void doSomething(){}
    public void doSomethingElse(){}
}

哪个更新为:

class Demo implements Serializable{
    private int a; private private int b; private int c; private String x; private String y; private String z;
    public void doSomething(){}
    public void doSomethingElse(){}
    public void doAnotherThing(){}
    public void doYetAnotherThing(){}
}

有没有办法可以无缝地将旧对象转换为新对象,而无需将新类命名为DemoNew或其他东西,然后逐个传输值?

问候。

1 个答案:

答案 0 :(得分:1)

这是serialVersionUID的用途。如果在新类中声明它,并且它具有与序列化对象时相同的值,那么Java将知道新类仍然与旧类兼容,并将初始化a,b和c(并将其他字段保留为默认值。)

因此,从抛出的错误中获取旧的serialVersionUID,并将此字段添加到类中:

private static final long serialVersionUID = ...;

当然,只有新类有效地与旧类兼容时才有效。如果您重命名或删除了字段,那么您必须通过明确地读取序列化时的对象来使其兼容。

如果我是你,我会停止使用序列化作为长期持久性机制。选择一种易于迁移的格式:例如数据库,JSON或XML。