我遇到了课程问题。我将数据作为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或其他东西,然后逐个传输值?
问候。
答案 0 :(得分:1)
这是serialVersionUID
的用途。如果在新类中声明它,并且它具有与序列化对象时相同的值,那么Java将知道新类仍然与旧类兼容,并将初始化a,b和c(并将其他字段保留为默认值。)
因此,从抛出的错误中获取旧的serialVersionUID,并将此字段添加到类中:
private static final long serialVersionUID = ...;
当然,只有新类有效地与旧类兼容时才有效。如果您重命名或删除了字段,那么您必须通过明确地读取序列化时的对象来使其兼容。
如果我是你,我会停止使用序列化作为长期持久性机制。选择一种易于迁移的格式:例如数据库,JSON或XML。