序列化/反序列化和Proguard

Ste*_*neT 10 serialization android proguard deserialization

使用我的一个应用程序,当我尝试更新我的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)
Run Code Online (Sandbox Code Playgroud)

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

在这里阅读了Proguard和序列化Java对象后,这显然暴露了我的问题,我无法解决我的问题......

在我的下一个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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

任何的想法 ?

提前感谢您的回答!

Eri*_*une 5

你可以试试这个:

  1. 计算混淆的可序列化类的serialVersionUID,并将它们添加到当前源代码中.
  2. 模糊新代码,保留serialVersionUID,同时确保可序列化类映射到先前混淆的名称(使用选项-applymapping).

  • 如何计算混淆的可序列化类的serialVersionUID? (9认同)
  • 这个答案缺少关于如何实现解决方案的示例代码 (2认同)