【发布时间】:2015-07-23 22:58:28
【问题描述】:
所以在我的 android 应用程序中,我有一个非常复杂的自定义类,它包含其他几个自定义类,所有这些都是可序列化的。
所以每个对象都有
private static final long serialVersionUID = 0L;
而且我没有使用任何writeObject 方法,所有数据大多是字符串、整数、布尔值和字符串数组列表。
问题是,更新应用程序后它随机不起作用,我从ObjectInputStream 收到一个InvalidClassException,说错误的serialVersionUID,发现一些长随机数但预期为0L。我已经宣布0L;在所有被序列化的类中。
它在测试过程中完美运行。这些更新中的更改可能包括更改对象方法中的某些代码,或者有时根本不涉及类。但我从未更改过 Oracle 文档中关于序列化对象的不兼容更改的任何字段或任何内容。
我正在构建启用了 proguard 的应用程序,我怀疑这与它有关吗?我读到了可以添加到配置 proguard 以更好地支持序列化的规则,但是现在这样做不会帮助我从以前的版本中恢复持久数据?还是会?
我为我的应用程序的下一个版本采用了不同的方法,以避免序列化,我将手动将我的对象转换为字符串以进行持久存储。
我是否可以从以前的版本中恢复序列化的持久数据?
我尝试扩展 ObjectInputStream 并忽略该问题的答案中描述的 serialVersionUID 比较: Make Java runtime ignore serialVersionUIDs?
但我得到ClassCastException 试图将我的自定义对象之一转换为字符串.. 这让我感到困惑。
所以我想知道,有什么办法可以恢复之前序列化的持久化数据?
【问题讨论】:
标签: java android serialization persistence proguard