Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从文件读取导致serialVersionUID错误_Java_Serialization - Fatal编程技术网

Java 从文件读取导致serialVersionUID错误

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

我一直在互联网上(包括stackoverflow)搜索关于这个错误的解释,但没有找到答案(或者至少我能理解)

我正在尝试序列化一个类,以便将对象保存到文件中。第一步是读取文件的当前内容,以便在中添加新对象。为此,我使用以下代码:

//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,它工作得非常好。