【问题标题】:Android storing persistent serializable object with proguardAndroid 使用 proguard 存储持久可序列化对象
【发布时间】: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


    【解决方案1】:

    抱歉,回复晚了,我希望也许其他人在这里跌跌撞撞会从中受益。

    我看到你写的关于 proguard 的内容,但事实上你看到的是一个你没想到的长数字,这听起来像是 ID 出现了某种错误,而你看到的长数字是系统通过散列您的课程创建一个 ID。如果是这种情况,很可能它在您更新之前做了同样的事情。

    我找到了一篇关于该主题的简洁帖子:http://c2.com/ppr/wiki/JavaIdioms/AlwaysDeclareSerialVersionUid.html

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

    【讨论】:

    • 谢谢,我想我不久前就确定了我有一些字段正在序列化,但我忘了标记瞬态。
    猜你喜欢
    • 2015-09-21
    • 2011-03-05
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多