gpt4 book ai didi

java - 从文件读取导致serialVersionUID错误

转载 作者:行者123 更新时间:2023-11-30 04:20:19 25 4
gpt4 key购买 nike

我一直在互联网(包括 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();
}

当到达标记为 //Problem Line 的行时,它会抛出此错误:

com.Private.automatorContainers.ReportList; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 8996775622132817386

我知道8996...是我目前在ReportList中的serialVersionUID,但我不知道在哪里1 来自。

我的工作理论是这样的:在我在 ReportList 中实现 Serializable 之前,我有一个等于 1L 的 UID,所以我假设这就是 1 的来源(对吗?请确认还是否认?)

我有两个问题。首先,UID存储在哪里?我不知道类似的东西存储在 .java 文件之外?我认为其他所有事情都是在编译时完成的。显然我的理解存在漏洞。

其次,如何让我的程序意识到 1 是错误的 serialVersionUID 并且需要更新?

最佳答案

这里的根本问题是文件系统上该文件的内容是使用与正在运行的代码使用的版本不兼容的 ReportList 版本编写的。 Java 通过在将对象写入流时记录对象类的serialVersionUID 来检测这种不兼容性;稍后,当您从流中读回该对象时,Java 会将记录的serialVersionUID 与它在运行时找到的对象类的serialVersionUID 进行比较。

您的选择是:

  • 使用最新版本的正在运行的代码以及您最初用于生成该内容的任何流程来重新创建该内容。
  • 通过将运行代码中 ReportList 类的 serialVersionUID 设置为 ,修改您的运行代码,使其与最初编写该文件的版本兼容1L 以匹配文件中的内容,正如本线程中其他人所建议的那样。请注意,仅当您确定文件中对象中的字段与最新代码中的字段相同,或者您已覆盖默认对象序列化行为时,才能执行此操作。

关于java - 从文件读取导致serialVersionUID错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17195777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com