Java Android使用proguard存储持久的可序列化对象

Java Android使用proguard存储持久的可序列化对象,java,android,serialization,persistence,proguard,Java,Android,Serialization,Persistence,Proguard,所以在我的android应用程序中,我有一个自定义类,非常复杂,它包含几个其他自定义类,所有这些类都是可序列化的 所以每一个物体都有 private static final long serialVersionUID = 0L; 我没有使用任何writeObject方法,所有数据都是字符串、整数、布尔值和字符串的arraylist 问题是,它在更新应用程序后随机不起作用,我从ObjectInputStream收到一个InvalidClassException,说SerialVersionId

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

所以每一个物体都有

private static final long serialVersionUID = 0L;
我没有使用任何writeObject方法,所有数据都是字符串、整数、布尔值和字符串的arraylist

问题是,它在更新应用程序后随机不起作用,我从ObjectInputStream收到一个InvalidClassException,说SerialVersionId错误,找到了一些长随机数,但预期为0L。我已申报0升;在所有被序列化的类中

它在测试期间工作得非常好。这些更新中的更改可能包括更改对象方法中的某些代码,或者有时根本不涉及类。但我从未更改过任何字段或Oracle文档中提到的有关序列化对象不兼容更改的任何内容

我正在构建启用proguard的应用程序,我怀疑这与此有关?我读过关于您可以添加规则来配置proguard以更好地支持序列化的内容,但现在这样做并不能帮助我从以前的版本恢复持久数据?还是会

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

我是否可以从以前的版本恢复序列化的持久数据

我尝试扩展ObjectInputStream并忽略SerialVersionId比较,如回答此问题时所述:

但是我得到ClassCastException试图将我的一个自定义对象转换为字符串。。这让我很困惑


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

很抱歉响应太晚,我希望可能有其他人会从中受益

我知道你在写什么关于proguard,但事实上你看到了一个你不期望的长数字,这听起来好像是ID有错误,你看到的长数字是系统通过散列你的类来创建ID。如果是这样的话,很可能它在更新之前也做了同样的事情

我发现了一篇关于这个主题的简洁帖子:


正如链接文档中所述,您可以通过查找更新之前使用的哈希serialVersionUID来访问旧数据。当然,假设ID确实是问题所在。

谢谢,我想我不久前确定了一些字段正在序列化,但我忘记了标记transient。