Con una mia app, ho avuto un problema con uno dei miei corsi Serialized quando provo ad aggiornare il mio APK.Serializzazione/Deserializzazione e Proguard
In effetti, c'erano problemi relativi agli oggetti salvati con la versione precedente dell'apk e la nuova versione dell'apk.
Nell'ultima APK (in produzione su Android Market), ho dimenticato di configurare il mio proguard.cfg per la classe Serializable (e quindi la loro statica serialVersionUID lungo finale membro) ...
Così, quando io cerco nel mio nuovo APK per ricaricare questo precedente classe Serializable immagazzinata, ho un InvalidClassException problema nel 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)
so che era un problema di offuscamento con oggetti Serializable e la loro serialVersionUID ...
Dopo aver letto Proguard and Serialized Java Objects qui che si espongono in modo chiaro il mio problema, io non sono in grado di risolvere il mio problema ...
Nel mio prossimo APK ho aggiungere questo nel mio 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();
}
per evitare il problema per i prossimi aggiornamenti, il mio ho davvero bisogno di tornare questi vecchi oggetti ...
ho provare a cambiare la serialVersionUID con 6593847879518920343L o 0L, senza successo ...
Qualche idea?
Grazie in anticipo per le vostre risposte!
Hai ragione! Tu salvi il mio weekend! :) – StephaneT
Come calcolare gli IDVersione seriale delle classi serializzabili offuscate? – peceps
Questa risposta manca di codice di esempio su come ottenere le soluzioni – McFarlane