10

在我的一个应用程序中,当我尝试更新我的 APK 时,我的一个序列化类出现了问题。

确实,以前版本的 apk 和新版本的 apk 保存的对象存在相关问题。

在最新的 APK(Android Market 上的生产中)中,我忘记为 Serializable 类配置我的 proguard.cfg(以及它们的静态最终长 serialVersionUID成员)......

因此,当我尝试在我的新 APK 中重新加载这个先前存储的 Serializable 类时,我在 StackTrace DDMS 中有一个InvalidClassException问题:

04-24 18:17:40.120: W/System.err(1204): java.io.InvalidClassException: cu; Incompatible class (SUID): cu: static final long serialVersionUID =6593847879518920343L; but expected cu: static final long serialVersionUID =0L;
04-24 18:17:40.125: W/System.err(1204):     at java.io.ObjectInputStream.verifyAndInit(ObjectInputStream.java:2380)
04-24 18:17:40.125: W/System.err(1204):     at java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1662)
04-24 18:17:40.125: W/System.err(1204):     at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:683)
04-24 18:17:40.125: W/System.err(1204):     at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1803)
04-24 18:17:40.125: W/System.err(1204):     at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787)
04-24 18:17:40.125: W/System.err(1204):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2003)
04-24 18:17:40.125: W/System.err(1204):     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1960)

我知道这是 Serializable 对象及其 serialVersionUID 的混淆问题......

在阅读了Proguard and Serialized Java Objects here 这清楚地暴露了我的问题之后,我无法解决我的问题......

在我的下一个 APK 中,我在 proguard.cfg 中添加了这个:

-keepnames class * implements java.io.Serializable

-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    !static !transient ;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

为了避免下次更新的问题,我真的需要取回这些旧对象......

我尝试使用 6593847879518920343L 或 0L 更改 serialVersionUID,但没有成功...

任何想法 ?

提前感谢您的回答!

4

1 回答 1

5

你可以试试这个:

  1. 计算经过混淆的可序列化类的 serialVersionUID,并将它们添加到当前源代码中。
  2. 混淆新代码,保留 serialVersionUID,但还要确保可序列化类映射到较早的混淆名称(使用选项 -applymapping)。
于 2013-04-26T00:23:35.047 回答