android – 序列化/反序列化和Proguard

我的一个应用程序,当我尝试更新我的APK时,我的一个序列化类的问题.

事实上,与以前版本的apk和新版本的apk一起保存的对象存在问题.

在最新的APK(在Android Market上生产)中,我忘了配置我的proguard.cfg for Serializable类(因此他们的静态最后的long 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这是明确的暴露了我的问题,我无法解决我的问题…

在我的下一个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,没有成功…

任何想法 ?

提前感谢您的答案!

解决方法

你可以试试这个:

>计算混淆的可序列化类的serialVersionUID并将其添加到当前的源代码中.>混淆新的代码,保留serialVersionUID,同时确保序列化类被映射到早期的混淆名称(使用选项-applymapping).

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...