Comment corriger Unmarshalling unknown type code XXX à offset YYY sous Android?

je vais avoir une panne de l'application sur le CV à cause d'une exception de non-mémorisation. J'ai vérifié que tous les Serializables ont un constructeur sans paramètres et j'ai même vérifié tous les serializables en utilisant ObjectStream (save to file et load from file). Comment puis-je comprendre le type de classe réel pour l'exception de cause par effet de décalage:

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.access0(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 sauvegardées se composent de Bundleet Serializables et ils ont l'air bon.

je vais faire le suivant:

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

Comment puis-je comprendre quel type est en fait pour L'offset séparable?

19
demandé sur 4ntoine 2014-02-18 09:17:20

8 réponses

il y a des règles pour écrire et lire les pièces.

1 - attention à l'inadéquation des types. Si vous écrivez int, n'essayez pas de lire long, etc.

2 - Faites attention à l'ordre d'écriture et de lecture. Les objets doivent être dans le même ordre de lecture et d'écriture.

les Deux peuvent causer des "Unmarshalling type inconnu code".

25
répondu asozcan 2016-05-04 13:52:03

c'est à cause de L'obfuscation Proguard - il a traité les cellules. solution:Proguard provoquant RuntimeException (Unmarshalling inconnu type de code) dans Parcelable classe

9
répondu 4ntoine 2017-05-23 12:34:45

dans mon cas, il est corrigé après la mise à niveau de la bibliothèque de soutien en 23.2.1

4
répondu Ignacio Tomas Crespo 2016-04-07 14:36:45

Si un type de Liste est ajouté, il doit être:

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

et unparcel 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());
3
répondu Subhas P 2017-04-07 12:36:32

ce n'est pas une question liée au pronostic.. Mais quand proguard et minify permettent c'est l'occurrence de 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 la même, que c'est comme la lecture du fichier.

vous pouvez utiliser le plug in android studio pour faire la classe comme parcelable https://plugins.jetbrains.com/plugin/7332?pr=

2
répondu Divy Sourabh 2016-04-22 08:11:42

dans mon cas, il a été causé par la taille des données dépassant la limite maximale de ce qui peut être mis à colis qui est d'environ 1 MB.

Solution: optimisez votre code séparable pour mettre le moins de données possible (par exemple, ne pas mettre D'objets sérialisables dans un paquet)

0
répondu Roman Minenok 2016-09-21 11:48:28

dans mon cas, ma classe n'a pas ajouté CREATOR filed lors de l'extension d'un autre parent séparable.

public class Image implements Parcelable {
        protected Image(Parcel in) {
        }

        public static final Creator<Image> CREATOR = new Creator<Image>() {
            @Override
            public Image createFromParcel(Parcel in) {
                return new Image(in);
            }

            @Override
            public Image[] newArray(int size) {
                return new Image[size];
            }
        };

        @Override
        public int describeContents() {
            return 0;
        }

        @Override
        public void writeToParcel(Parcel dest, int flags) {
        }
}

public class ImageChild extends Image {
        protected ImageChild(Parcel in) {
            super(in);
        }


        @Override
        public int describeContents() {
            return 0;
        }

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

dans ImageChild champ créateur manquant

0
répondu hovo888s 2018-02-07 08:35:20

en utilisant Kotlin, l'objet 'Nota' a un objet personnalisé 'CentroCusto' qui ne contient que des propriétés primitives.

class Nota(var id: Int? = null, var centroCusto: ArrayList<CentroCusto>? = null) : Parcelable {

constructor(source: Parcel) : this(
        source.readValue(Int::class.java.classLoader) as Int?,
        //Exception in below line -> Unmarshalling unknown type code 
        source.createTypedArrayList(CentroCusto.CREATOR) 
)

override fun describeContents() = 0

override fun writeToParcel(dest: Parcel, flags: Int) = with(dest) {
    writeValue(id)
    writeTypedList(centroCusto)
}

companion object {
    @JvmField
    val CREATOR: Parcelable.Creator<Nota> = object : Parcelable.Creator<Nota> {
        override fun createFromParcel(source: Parcel): Nota = Nota(source)
        override fun newArray(size: Int): Array<Nota?> = arrayOfNulls(size)
    }
}
class CentroCusto(var id: Int? = null, var descricao: String? = null, var aprovacaoDiretoria: Int? = null, var permiteMarcar: Boolean? = null) : Parcelable {

constructor(parcel: Parcel) : this(
        parcel.readValue(Int::class.java.classLoader) as? Int,
        parcel.readString(),
        parcel.readValue(Int::class.java.classLoader) as? Int,
        parcel.readValue(Boolean::class.java.classLoader) as? Boolean) {
}

override fun writeToParcel(parcel: Parcel, flags: Int) {
    parcel.writeValue(id)
    parcel.writeString(descricao)
    parcel.writeValue(aprovacaoDiretoria)
    parcel.writeValue(permiteMarcar)
}

override fun describeContents(): Int {
    return 0
}

companion object CREATOR : Parcelable.Creator<CentroCusto> {
    override fun createFromParcel(parcel: Parcel): CentroCusto {
        return CentroCusto(parcel)
    }

    override fun newArray(size: Int): Array<CentroCusto?> {
        return arrayOfNulls(size)
    }
}

}
0
répondu Tomate Albertini 2018-02-16 17:39:51