我看到这里有几个相关的问题和答案,但它们似乎没有帮助。所以我想在这里发布一个单独的问题:
我有一个可序列化的类MyDataClass,其中包含几个更多的可序列化内部类。我使用FileOutputStream和ObjectOutputStream将其保存到文件中。当读取它时,有时会出现异常(可能是ClassNotFoundException或InvalidClassException,但我不确定),异常消息如下:
然后我使用以下代码来读取它:
readObject方法有时会引发异常,但并非每次都会出现。我在某个地方读到,实际写入文件的 serialVersionUID 不是我在代码中分配的那个。因此,在读回时,UID 不匹配,从而导致异常。如果是这样,我该如何确保没有异常,并按预期读取对象?谢谢。
编辑:从 Eclipse 进行调试时,一切正常。但是在使用 ant 构建后,问题就会出现。但并非每次经过 ant 构建后都会出现问题,只是偶尔会有。
编辑:在另一个帖子中,我看到了这样一段话:
“你是从文件中读取的吗?如果是这样,那么现在添加 serialVersionUID 是无关紧要的,它与存储在文件中的不同,这会导致异常。一个快速的解决方法是将 serialVersionUID 设置为 4209360273818925922L,这似乎是 Java 在您保存那些对象时自动生成的 serialVersionUID。”
当用户使用应用程序时,我的文件将被多次保存/读取。如果 Java 每次文件保存时都分配一个不同的 UID,那么我怎样才能提前在代码中设置一个静态 UID?我需要一个真正静态的 UID,即使经过 ant 构建也不会改变。
我有一个可序列化的类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 设置为 4209360273818925922L,这似乎是 Java 在您保存那些对象时自动生成的 serialVersionUID。”
当用户使用应用程序时,我的文件将被多次保存/读取。如果 Java 每次文件保存时都分配一个不同的 UID,那么我怎样才能提前在代码中设置一个静态 UID?我需要一个真正静态的 UID,即使经过 ant 构建也不会改变。