隨着我的一個應用程序,當我嘗試更新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 ...
有什麼想法?
在此先感謝您的答案!
你是對的!你救了我的週末! :) – StephaneT 2013-05-03 08:53:40
如何計算混淆可序列化類的serialVersionUID? – peceps 2015-05-07 14:57:38
此答案缺少關於如何實現解決方案的示例代碼 – McFarlane 2016-06-09 08:28:00