有一个类 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/