2013-04-25 17 views
10

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!

Odpowiedz

5

Można spróbować to:

  1. Obliczyć serialVersionUIDs z ukrywane klas SERIALIZABLE i dodać je do aktualnego kodu źródłowego.
  2. Obfuskuj nowy kod, zachowując identyfikatory serialVersionUID, ale także upewnij się, że klasy serializowalne są odwzorowane na wcześniej zaciemnione nazwy (z opcją -applymapping).
+0

Masz rację! Uratujesz mój weekend! :) – StephaneT

+7

Jak obliczyć serialVersionUIDs z zaciemnianych klas serializowalnych? – peceps

+1

W tej odpowiedzi brakuje przykładowego kodu, jak uzyskać rozwiązania – McFarlane