我在这里看到了一些相关的问题和答案,但它们似乎没有帮助。所以我想我需要在这里发布一个单独的问题:关于序列化,serialVersionUID和不兼容的类
我有一个可序列化的类MyDataClass
,它包含几个可序列化的内部类。我通过使用FileOutputStream
和ObjectOutputStream
将它保存到文件中。当看完后,我有时会得到一个异常(也许ClassNotFoundException
或InvalidClassException
,但我不知道),以及异常的消息是这样的:
12-01 18:44:16.479: D/My App Name(534): ***** exception occurred
com.xyz.myapp.lib.am; Incompatible class (SUID): com.xyz.myapp.lib.am:
static final long serialVersionUID =3894560643019408205L; but expected
com.xyz.myapp.lib.am: static final long serialVersionUID =-4215454881436014736L;
MyDataClass
是这样的:
public static class MyDataClass implements Serializable {
private static final long serialVersionUID = 0x98F22BF5;
.....
public boolean bNoTitle;
public short syncOption;
.....
public class InnerClass implements Serializable {
private static final long serialVersionUID = 0x99D32720;
double premium;
double interest;
}
}
然后我用下面的代码来阅读:
MyDataClass oc;
FileInputStream fin = new FileInputStream(dataFile);
ObjectInputStream ois = new ObjectInputStream(fin);
oc = (MyDataClass)ois.readObject();
ois.close();
fin.close();
一个例外是的readObject,每次都不抛出,但有时,我不能精确到目前为止。我在某处读到实际写入文件的serialVersionUID与我在代码中分配的不同。所以当它回读时,UID不匹配,因此是异常。是对的吗?如果是这样,我如何确保没有异常,并且按预期回读对象?
谢谢。
编辑:看来,从Eclipse调试时,它都很好。但在使用ant
进行构建之后,问题就会浮出水面。但并不是每次构建ant
之后,但有时。
编辑:
你从文件中读取:我在另一篇文章中看到的?在这种情况下,现在添加serialVersionUID并不重要,它与存储在文件中的serialVersionUID不同,并且会创建异常。一个快速的解决方案可能是将serialVersionUID设置为4209360273818925922L,这似乎是当您在那个文件中保存那些对象时由java自动生成的serialVersionUID。
当用户使用该应用程序时,我的文件将被保存/读取很多次。如果Java每次分配一个不同的UID 该文件保存,那么我怎样才能在代码中手动插入一个数字?我需要一个真正的静态UID,即使在ant
构建之后也不会改变。
您是否有意将整数指定为serialVersionUID?通常这不应该是一个问题,但通常你应该使用长的值。 – Robert
@罗伯特,不是故意的,它恰好是如此。我不认为这是一个问题。 – wwyt