java - 反序列化对象,其类 serialVersionUID 在 Java 中已更改

标签 java android serialization deserialization

有一个类 User 实现了 Serializable,但在第一个版本中没有定义 serialVersionUID。 在下一个版本中,我提供了一个 final serialVersionUID

现在的问题是,每当我尝试反序列化之前存储的 User 对象时,我都会收到错误消息:

static final long serialVersionUID =4061053075992556495L; but expected com.example.android.User: static final long serialVersionUID =-1079331593441085712L;

我正在使用 FileInputStream 读取数据。

FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
User object = (User) ois.readObject();
ois.close();

有没有办法将旧对象反序列化为这个 serialVersionUID

最佳答案

这就是 java 序列化的问题:当你像这样搞砸时,你经常永远崩溃。

但也许它就像 EJP 所建议的那样简单(而且通常是正确的)。然后,您只需更改您的当前 类,使其具有消息告诉您使用的序列 uid。

如果您在创建这些文件后获得类版本的机会是 compatible ,那么您或许可以通过这种方式解决您的问题。

如果这不起作用:将您的类定义返回到旧设置。反序列化这些文件——并将它们序列化为另一种更健壮的格式,例如 JSON。然后,您可以继续将 JSON 内容重新用于类结构发生更改的较新版本的类。

或者接受你丢失了那些文件。这是在没有完全理解概念的情况下使用概念的后果之一。痛苦但有时几乎是不可避免的。

最后:还有另一种选择。 Java 序列化格式遵循标准过程。因此,可以为您的对象的这种二进制表示编写一个解析器(如果您能找到现有的工具为您做这件事,我不会感到惊讶)。

意思是:如果那些文件的内容对你来说真的很重要,你也许能够访问文件中的信息。您无法以“正常”方式反序列化它们,但信息仍然存在并且可能可以访问,只要付出一些努力。

关于java - 反序列化对象,其类 serialVersionUID 在 Java 中已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43900620/

相关文章:

android - 保存 ArrayList 内容的最佳方法是什么?

java - Kotlin/Java 在 Int 类型的 switch 语句中使用枚举

java - 为什么 RestTemplate 不对 '+' 符号进行 urlencode,而是对其他所有内容进行 urlencode?

.net - 序列化自定义对象生成带有丢失信息的文件

android - 如何直接播放/流式传输存储在 BLOB 中的视频

android - 查看 Android 键盘缓存

python - Django Rest Framework - 嵌套序列化不嵌套

java - Hibernate:调用 List.contains 时不会调用 contains

java - 打印数组方法

java - 我可以把它放到一个for循环中吗?