我在一个项目中的AJavaClass.java文件中有一个java类,比如MyFirstProject。
package mypackage;
class AJavaClass implements java.io.Serializable{
//instance variables
int var1;
int var2;
String stringVar1;
AJavaClass(arg1,arg2){
aJavaClassMethod(arg1,arg2);
}
public void aJavaClassMethod(arg1,arg2){
}
}在另一个项目中,比如MySecondProject,我在该项目中有相同的类和相同的命名包,但结构略有不同:
package mypackage;
class AJavaClass java.io.Serializable{
//instance variables
int var1;
int var2;
String stringVar1;
//note 4 param constructor
AJavaClass(arg1,arg2,arg3,arg4){
aJavaClassMethod(arg1,arg2,arg3,arg4);
}
//note 4 param method but with same name
public void aJavaClassMethod(arg1,arg2,arg3,arg4){
}
}现在,我创建MyFirstProject的时间早于MySecondProject。然后我将AJavaClass的几个实例序列化到一个目录中。但后来,由于一些非常真实的原因,我需要更新AJavaClass,以便aJavaClassMethod接受4 params.Now问题是,当我试图使用MyFirstProject的AJavaClass反序列化由me项目的AJavaClass序列化的对象时,它给了我java.io.InvalidClassException:
那么,我是否可以在AJavaClass中使用由MySecondProject项目的MyFirstProject序列化的对象?(请注意,类中没有零arg构造函数,因此排除了继承)。
发布于 2014-01-14 20:53:17
那么,我是否可以在AJavaClass中使用由MySecondProject项目的MyFirstProject序列化的对象?
是。异常消息告诉您实际和预期的序列化values值。只需将期望值放入该类的新版本:
private static final long serialVersionUID = 123456789L; // or whatever the message says事实上,如果它仍然存在的话,也要把它放到旧版本中去。
发布于 2014-01-14 18:55:47
除非您恢复到写入序列化数据时存在的类结构,否则您将无法获得数据。如果没有定义serialVersionUID,那么Java将根据类结构生成一个。如果类的串行ID与文件的序列ID不同,您将得到一个InvalidClassException。
如果数据至关重要,则还原类并获取数据。如果您真的想要的话,可以使用类的两个版本并编写一个方法来加载文件,创建一个最新类的实例并将其写回数据。
https://stackoverflow.com/questions/21121305
复制相似问题