Przy jednej z moich aplikacji miałem problem z jedną z moich klas Serializowanych, gdy próbuję zaktualizować plik APK.Serializacja/Deserialization & Proguard
Rzeczywiście istniały problemy związane z obiektami zapisanymi przy poprzedniej wersji apk i nowej wersji apk.
W najnowszej produkcji APK (Android Market) na, ja zapomniałem skonfigurować moje proguard.cfg dla Serializable klasy (a więc ich static final długo serialVersionUID członek) ...
Więc kiedy staram się w mojej nowej APK przeładować ten poprzedni zapisany klasę Serializable, mam InvalidClassException problem w 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)
wiem, że był problem z zaciemniania serializacji obiektów i ich serialVersionUID ...
Po przeczytaniu Proguard and Serialized Java Objects tutaj co wyraźnie wystawiać mój problem, nie jestem w stanie rozwiązać mój problem ...
W następnym APK mam dodać w moim 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();
}
uniknięcia problemu dla kolejnych aktualizacjach, mój naprawdę muszę wrócić do tych starych obiektów ...
ja już próbować zmienić serialVersionUID z 6593847879518920343L lub 0L, bez powodzenia ...
Jakiś pomysł?
Z góry dziękuję za odpowiedzi!
Masz rację! Uratujesz mój weekend! :) – StephaneT
Jak obliczyć serialVersionUIDs z zaciemnianych klas serializowalnych? – peceps
W tej odpowiedzi brakuje przykładowego kodu, jak uzyskać rozwiązania – McFarlane