2013-04-25 10 views
10

Mit einer meiner App hatte ich ein Problem mit einer meiner serialisierten Klassen, wenn ich versuche, meine APK zu aktualisieren.Serialisierung/Deserialisierung & Proguard

In der Tat gab es Probleme im Zusammenhang mit Objekten mit der vorherigen Version der apk und der neuen Version der apk gespeichert.

In der neuesten APK (in der Produktion auf Android Market), ich habe vergessen, meine proguard.cfg für Serializable Klasse (und so ihr static final lange serialVersionUID Mitglied) ...

So zu konfigurieren, wenn ich versuche, in meinem neuen APK diese vorher gespeicherten Serializable Klasse neu zu laden, ich habe ein InvalidClassException Problem in der 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) 

ich weiß, es war ein Verschleierungs Problem mit Serializable Objekten und ihrer serialVersionUID ...

Nach Proguard and Serialized Java Objects hier lesen, was mein Problem klar belichten ist, bin ich nicht in der Lage, mein Problem zu lösen ...

In meinem nächsten APK habe ich hinzufügen, das in meinem 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(); 
}

das Problem für den nächsten Updates zu vermeiden, meine ich wirklich ...

diese alten Objekte benötigen, um wieder hab ich versuchen, die serialVersionUID mit 6593847879518920343L oder 0L zu ändern, ohne Erfolg ...

Irgendeine Idee?

Vielen Dank im Voraus für Ihre Antworten!

Antwort

5

Sie konnten dieses versuchen:

  1. Berechnen Sie die serialVersionUIDs der serializable Klassen verschleiert und fügen Sie sie auf den aktuellen Quellcode.
  2. Verschleiern Sie den neuen Code unter Beibehaltung der serialVersionUIDs, stellen Sie aber auch sicher, dass die serialisierbaren Klassen den früheren verschleierten Namen zugeordnet sind (mit der Option -Applymapping).
+0

Sie haben Recht! Du sparst mein Wochenende! :) – StephaneT

+7

Wie berechne ich die serialVersionUIDs der verschleierten serialisierbaren Klassen? – peceps

+1

Diese Antwort fehlt Beispielcode, um die Lösungen zu erreichen – McFarlane