序列化/反序列化和Proguard



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

的确,在旧版本的apk和新版本的apk中存在与保存对象相关的问题。

在最新的APK中(在Android Market上生产),我忘记配置我的proguard.cfg为Serializable类(所以他们的static final long serialVersionUID成员)…

所以当我尝试在我的新APK重新加载这个以前存储的Serializable类,我有一个InvalidClassException问题在StackTrace DDMS:

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和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,没有成功…

你知道吗?

谢谢你的回答!

你可以试试:

  1. 计算混淆的可序列化类的serialversionuid,并将它们添加到当前的源代码中。
  2. 混淆新代码,保留serialversionuid,但也要确保可序列化的类映射到早期混淆的名称(使用选项-applymapping)。

相关内容

  • 没有找到相关文章

最新更新