反序列化其类serialVersionUID已在Java

时间:2017-05-10 18:54:18

标签: java android serialization deserialization

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

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

  

static final long serialVersionUID = 4061053075992556495L;但预计   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

1 个答案:

答案 0 :(得分:4)

这就是java序列化的问题:当你搞砸了这样的事情时,你经常经常被打破。

但也许它就像EJP建议的那样简单(并且最常见)。然后,您只需更改当前类,即可获得消息告诉您使用的序列uid。

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

如果不能解决问题:将类定义转回旧设置。反序列化这些文件 - 并将它们序列化为另一种更健壮的格式,例如JSON。然后,您可以继续使用类的更新版本重新使用JSON内容,这些版本随类更改而变化。

或接受您丢失了这些文件。这是使用概念而不完全理解它们的后果之一。痛苦但有时几乎不可避免。

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

含义:如果这些文件的内容对您非常重要,您可以访问文件中的信息。您无法以“正常”方式对它们进行反序列化,但是信息仍然存在,并且可以通过一些努力进行访问。

相关问题