2013-04-25 104 views
10

隨着我的一個應用程序,當我嘗試更新APK時,我的一個序列化類出現問題。序列化/反序列化和Proguard

事實上,在之前版本的apk和apk的新版本中保存的對象存在問題。

在最新的APK(生產在Android Market),我已經忘了我的配置爲proguard.cfg Serializable類(因此他們靜態最後的serialVersionUID長成員)...

所以當我試着在我的新APK重新裝入此之前存儲的Serializable類,我在堆棧跟蹤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) 

我知道這是一個模糊問題,可序列化對象以及它們的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 ...

有什麼想法?

在此先感謝您的答案!

回答

5

你可以試試這個:

  1. 計算的的serialVersionUIDs混淆序列化類,並將其添加到當前的源代碼。
  2. 混淆新代碼,保留serialVersionUID,但也要確保可序列化的類映射到較早的混淆名稱(使用-applymapping選項)。
+0

你是對的!你救了我的週末! :) – StephaneT 2013-05-03 08:53:40

+7

如何計算混淆可序列化類的serialVersionUID? – peceps 2015-05-07 14:57:38

+1

此答案缺少關於如何實現解決方案的示例代碼 – McFarlane 2016-06-09 08:28:00