Java 从文件读取导致serialVersionUID错误
我一直在互联网上(包括stackoverflow)搜索关于这个错误的解释,但没有找到答案(或者至少我能理解) 我正在尝试序列化一个类,以便将对象保存到文件中。第一步是读取文件的当前内容,以便在中添加新对象。为此,我使用以下代码:Java 从文件读取导致serialVersionUID错误,java,serialization,Java,Serialization,我一直在互联网上(包括stackoverflow)搜索关于这个错误的解释,但没有找到答案(或者至少我能理解) 我正在尝试序列化一个类,以便将对象保存到文件中。第一步是读取文件的当前内容,以便在中添加新对象。为此,我使用以下代码: //masterFilePath is a java.io.File that contains the "master file" I'm reading. //ReportList is a simple extension of ArrayList String
//masterFilePath is a java.io.File that contains the "master file" I'm reading.
//ReportList is a simple extension of ArrayList
String[][] returner = null;
ReportList listOfReports = null;
try{
FileInputStream fileReader = new FileInputStream(masterFilePath);
ObjectInputStream objectReader = new ObjectInputStream(fileReader);
listOfReports = (ReportList) (objectReader.readObject()); //Problem Line
objectReader.close();
} catch (IOException | ClassNotFoundException e){
e.printStackTrace();
}
当它到达标记为//问题行
的行时,会抛出以下错误:
com.Private.automatorContainers.ReportList; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 8996775622132817386
我知道8996…
是serialVersionUID
我目前在ReportList
中拥有的1的来源
我的工作原理是:在我在ReportList中实现Serializable
之前,我有一个UID,它等于1L
,所以我假设这就是1的来源(对吗?请确认还是拒绝?)
我有两个问题。首先,UID存储在哪里?我不知道类似的东西存储在.java文件之外?我想其他的都是在编译时完成的。显然,我的理解有一个漏洞
其次,我如何让我的程序认识到1是错误的serialVersionUID
,它需要更新?如果流声明序列化对象具有serialVersionUID=1
,读取它的唯一方法是将类serialVersionUID也设置为1
private static final long serialVersionUID = 1L;
如果不定义serialVersionUID
java将根据类的属性为您生成一个,这很可能不是1
将对象写入文件时,类定义中的serialVersionUid似乎为1
将定义更改为1,重新编译JAR,它就会正常工作。这里的基本问题是,文件系统上该文件的内容是使用与正在运行的代码所使用的版本不兼容的ReportList
版本编写的。Java通过在将对象写入流时记录对象类的SerialVersionId来检测这种不兼容性;稍后,当您从流中读回该对象时,Java会将记录的serialVersionUID与在运行时为该对象的类找到的serialVersionUID进行比较
您的选择是:
- 使用运行代码的最新版本重新创建该内容,使用最初用于生成该内容的任何进程
- 通过将运行代码中的
ReportList
类的serialVersionUID
设置为1L
,以匹配文件中的内容,修改运行代码,使其与最初编写文件的版本兼容,正如此线程中的其他人所建议的那样。请注意,只有在确定文件中对象中的字段与最新代码中的字段相同,或者已覆盖默认对象序列化行为时,才能执行此操作
序列化和反序列化时,ReportList
类定义应具有相同的serialVersionUID
。将类序列化为文件的代码必须将serialVersionUID
定义为1,其中当前使用的类文件将其定义为8996775622132817386
。并且,作为记录,我使用了选项1,它工作得非常好。