2013-04-25 7 views
10

मेरे ऐप में से एक के साथ, जब मैं अपने एपीके को अपडेट करने का प्रयास करता हूं तो मुझे अपने सीरियलाइज्ड क्लास में से एक के साथ समस्या थी।सीरियलाइजेशन/Deserialization और Proguard

दरअसल, एपीके के पिछले संस्करण और एपीके के नए संस्करण से सहेजी गई वस्तुओं से संबंधित समस्याएं थीं।

नवीनतम APK (Android बाजार पर उत्पादन में) में, मैं Serializable वर्ग के लिए मेरी proguard.cfg कॉन्फ़िगर करने के लिए (और इसलिए उनके स्थिर अंतिम लंबे serialVersionUID सदस्य) ...

तो जब भूल गए मैं अपने नए APK में कोशिश यह पिछले संग्रहीत Serializable वर्ग को फिर से लोड करने के लिए, मैं StackTrace डी डी एम एस में एक InvalidClassException समस्या है:

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) 

मैं जानता हूँ कि यह Serializable वस्तुओं और उनकी serialVersionUID के साथ एक कहानियो समस्या थी ...

यहाँ Proguard and Serialized Java Objects पढ़ने जो स्पष्ट रूप से मेरी समस्या का पर्दाफाश होने के बाद, मैं अपने समस्या को हल करने में सक्षम नहीं हूँ ...

मेरी अगली APK में मैं अपने 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(); 
}

अगले अद्यतन के लिए समस्या से बचने के, मेरे मैं वास्तव में इन पुराने वस्तुओं वापस पाने के लिए जरूरत है ...

मैं 6593847879518920343L या 0L, कोई सफलता के साथ serialVersionUID परिवर्तित करने का प्रयास किया है ...

कोई विचार?

आपके उत्तरों के लिए अग्रिम धन्यवाद!

उत्तर

5

आप इस कोशिश कर सकते:

  1. कंप्यूट की serialVersionUIDs serializable वर्गों समझ से परे है और उन्हें वर्तमान स्रोत कोड में जोड़ें।
  2. serialVersionUID को संरक्षित करने के लिए नए कोड को बाधित करें, लेकिन यह भी सुनिश्चित कर लें कि धारावाहिक वर्गों को पहले के obfuscated नामों (विकल्प -applymapping के साथ) मैप किया गया है।
+0

आप सही हैं! आप मेरे सप्ताहांत बचाओ! :) – StephaneT

+7

obfuscated serializable कक्षाओं के serialVersionUID की गणना कैसे करें? – peceps

+1

इस उत्तर में समाधान प्राप्त करने के तरीके पर उदाहरण कोड गुम है – McFarlane

संबंधित मुद्दे