Comment réparer Unmarshalling code de type inconnu XXX au décalage YYY dans Android?

J'ai un crash d'application sur CV en raison de l'exception Unmarshalling. J'ai vérifié tous les Serializables ont un constructeur sans paramètres et même vérifié tous les serializables à l'aide d'ObjectStream (sauvegarde dans le fichier et chargement à partir du fichier). Comment puis-je comprendre le type de classe réel pour le décalage partagé qui cause une exception:

Parcel android.os.Parcel@42209460: Unmarshalling unknown type code 2131165303 at offset 3748 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2080) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2105) at android.app.ActivityThread.access$600(ActivityThread.java:136) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1201) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4876) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:804) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:571) at com.kdgdev.xtension.core.XtensionMain.main(XtensionMain.java:91) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@42209460: Unmarshalling unknown type code 2131165303 at offset 3748 at android.os.Parcel.readValue(Parcel.java:2032) at android.os.Parcel.readSparseArrayInternal(Parcel.java:2255) at android.os.Parcel.readSparseArray(Parcel.java:1687) at android.os.Parcel.readValue(Parcel.java:2022) at android.os.Parcel.readMapInternal(Parcel.java:2226) at android.os.Bundle.unparcel(Bundle.java:223) at android.os.Bundle.getSparseParcelableArray(Bundle.java:1232) at com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:1690) at android.app.Activity.onRestoreInstanceState(Activity.java:999) at com.actionbarsherlock.app.SherlockFragmentActivity.onRestoreInstanceState(Unknown Source) at name.myname.android.app.ui.MainActivity.onRestoreInstanceState(Unknown Source) at android.app.Activity.performRestoreInstanceState(Activity.java:971) at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1130) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2058) ... 12 more 

Les données enregistrées se composent de Bundle s et Serializable s et tous ont l'air bien.

Je vais faire le prochain:

 try { // unmarshalling } catch (Throwable t) { // look offset } 

Comment puis-je comprendre quel type est en fait pour le décalage partagé?

6 Solutions collect form web for “Comment réparer Unmarshalling code de type inconnu XXX au décalage YYY dans Android?”

Il existe des règles pour écrire et lire des modules.

1- Faites attention au type désagréable. Si vous écrivez int, n'essayez pas de lire longtemps, etc.

2- Faites attention à l'ordre des écritures et des lectures. Les objets doivent être au même ordre lors de la lecture et de l'écriture.

Les deux peuvent provoquer "Unmarshalling code de type inconnu".

C'est à cause de l'obscurcissement de Proguard – il a traité Parcelable. Solution: Proguard provoquant RuntimeException (Unmarshalling code de type inconnu) dans la classe Parcelable

Dans mon cas, il est corrigé après la mise à niveau de la bibliothèque de support au 23.2.1

Ce n'est pas une question liée à Proguard … Mais quand proguard et minify le permettent, le problème est toujours.

Le problème est dans l'ordre de l'écriture et de la lecture de l'objet … la séquence doit être identique, car c'est comme lire le fichier.

Vous pouvez utiliser Android studio plug for make class comme parcelable https://plugins.jetbrains.com/plugin/7332?pr=

Si un type de liste est ajouté, il devrait être:

 @Override public void writeToParcel(Parcel dest, int flags) { super.writeToParcel(dest, flags); dest.writeList(this.mList); 

Et ne le réparez pas en utilisant le type de classe comme ceci:

 protected MyClass(Parcel in) { super(in); this.mList = new ArrayList<>(); in.readList(this.mList, MyRequiredClass.class.getClassLoader()); 

Dans mon cas, il a été causé par une taille de données dépassant la limite maximale de ce qui peut être mis sur Parcel qui est d'environ 1 Mo.

Solution: optimisez votre code Parcelable pour mettre autant de données que possible (par exemple, ne mettez pas d'objets sérialisables sur Parcel)

coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.