序列化/反序列化和放大器; Proguard的 [英] Serialization / Deserialization & Proguard

查看:458
本文介绍了序列化/反序列化和放大器; Proguard的的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用我的应用程序之一,我有一个问题,我的序列化的一个类,当我尝试更新我的APK。

With one of my app, I had a problem with one of my Serialized classes when I try to update my APK.

实际上,有涉及到保存在的apk的previous版本和的apk的新版本的对象的问题。

Indeed, there were problems related to objects saved with the previous version of the apk and the new version of the apk.

在最新的APK(在生产Android电子市场),我已经忘了配置我proguard.cfg的序列化类(因此他们的静态最后长的serialVersionUID 成员)...

In the latest APK (in production on Android Market), I've forgot to configure my proguard.cfg for Serializable class (and so their static final long serialVersionUID member)...

所以,当我在新的APK尝试重新加载这个previous存储序列化类,我有一个 InvalidClassException 在堆栈跟踪DDMS问题:

So when I try in my new APK to reload this previous stored Serializable class, I've a InvalidClassException problem in the 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)

我知道这是一个模糊的问题,序列化对象以及它们的serialVersionUID ...

I know it was a obfuscation problem with Serializable objects and their serialVersionUID...

阅读 Proguard的,并经过序列化的Java对象这里这显然暴露了我的问题,我没能解决我的问题...

After reading Proguard and Serialized Java Objects here which is clearly expose my problem, I'm not able to solve my problem...

在我的下一个APK我在我的proguard.cfg补充一点:

In my next APK I've add this in my 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();
}

,以避免下一次更新的问题,我我真的需要找回这些老物件......

to avoid the problem for next updates, my I really need to get back these old objects...

我已经尝试改变的serialVersionUID与6593847879518920343L或0L,没有成功...

I've try to change the serialVersionUID with 6593847879518920343L or 0L, no success...

你知道吗?

在此先感谢您的回答!

推荐答案

您可以试试这个:

  1. 计算的混淆的序列化类的serialVersionUIDs并将其添加到当前的源$ C ​​$ C。
  2. 模糊处理新的code,preserving的serialVersionUIDs,而且还确保了序列化类映射到前面混淆的名称(通过选项-applymapping)。
  1. Compute the serialVersionUIDs of the obfuscated serializable classes and add them to the current source code.
  2. Obfuscate the new code, preserving the serialVersionUIDs, but also making sure the serializable classes are mapped to the earlier obfuscated names (with the option -applymapping).

这篇关于序列化/反序列化和放大器; Proguard的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆