Сериализация / Десериализация & Proguard

С одним из моих приложений у меня возникла проблема с одним из моих сериализованных классов при попытке обновить APK.

действительно, были проблемы, связанные с объектами, сохраненными с предыдущей версией apk и новой версией apk.

в последнем APK (в производстве на Android Market) я забыл настроить свой proguard.cfg для Сериализуемого класса (и поэтому их статический окончательный длинный serialVersionUID member)...

поэтому, когда я пытаюсь в своей новый APK для перезагрузки этого предыдущего сохраненного Сериализуемого класса, у меня есть InvalidClassException проблема в DDMS StackTrace:

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 и сериализованные объекты Java здесь, который явно разоблачает мою проблему, я не могу решить свою проблему...

в моем следующем APK я добавил Это в свой proguard.контекстно-свободная грамматика :

-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();
}

чтобы избежать проблемы для следующих обновлений, мне действительно нужно вернуть эти старые объекты...

Я попытался изменить serialVersionUID с 6593847879518920343L или 0L, без успеха...

есть идеи ?

заранее спасибо за ваши ответы !

1 ответов


вы можете попробовать это:

  1. вычислить serialVersionUIDs запутывание сериализуемые классы и добавлять их в текущий исходный код.
  2. запутать новый код, сохранив serialVersionUIDs, но также убедившись, что сериализуемые классы сопоставлены с более ранними запутанными именами (с опцией-applymapping).