Android使用proguard

时间:2015-05-12 21:14:33

标签: java android serialization persistence proguard

所以在我的Android应用程序中,我有一个自定义类,它非常复杂,它包含其他几个自定义类,所有这些都是可序列化的。

所以每个对象都有

private static final long serialVersionUID = 0L;

我没有使用任何writeObject方法,所有数据主要是字符串,整数,布尔和字符串的arraylist。

问题是,它在更新应用后随机无效,我从InvalidClassException得到ObjectInputStream错误的serialVersionUID,找到一些长的随机数,但预计为0L。我宣布0L;在所有被序列化的类中。

它在测试期间完美运行。这些更新中的更改可能包括更改对象方​​法中的某些代码,或者有时根本不触及该类。但是我从未改变Oracle文档中关于序列化对象的不兼容更改的任何字段或任何内容。

我正在使用proguard构建应用程序,我怀疑这与它有关吗?我读到了可以添加的规则来配置proguard以更好地支持序列化,但现在这样做不会帮助我恢复以前版本的持久数据?或者会吗?

我为我的应用程序的下一个版本采用了不同的方法,以避免序列化,我将手动将对象转换为字符串以持久存储。

无论如何我可以恢复以前版本的序列化持久数据吗?

我尝试扩展ObjectInputStream并忽略serialVersionUID比较,如此问题的答案中所述: Make Java runtime ignore serialVersionUIDs?

但我让ClassCastException尝试将我的一个自定义对象转换为字符串..这让我感到困惑。

所以我想知道,有什么方法可以恢复以前序列化的持久数据吗?

1 个答案:

答案 0 :(得分:0)

对于迟到的回复感到抱歉,我希望也许在这里偶然发现的其他人会从中受益。

我看到你在写关于proguard的内容,但事实上你看到了一个你没想到的长数字,这听起来好像是ID出了问题,你看到的长数就是系统从散列你的类创建一个ID。如果是这种情况,可能会在更新之前做同样的事情。

我在这个主题上找到了一篇简洁的帖子:http://c2.com/ppr/wiki/JavaIdioms/AlwaysDeclareSerialVersionUid.html

正如链接文档中所述,您可以通过查找更新前使用的散列serialVersionUID来访问旧数据。当然,假设身份证实际上是问题。