studio putparcelable online example android serialization marshalling unmarshalling parcelable

putparcelable - ¿Cómo arreglar Unmarshalling unknown type code XXX en offset YYY en Android?



putparcelable android (9)

Tengo un bloqueo de aplicaciones en el currículum debido a la excepción Unmarshalling. He comprobado que todos los Serializables tienen constructor sin parámetros e incluso he comprobado todos los serializables utilizando ObjectStream (guardar en archivo y cargar desde archivo). ¿Cómo puedo entender el tipo de clase real para el desplazamiento parcelable que causa la excepción:

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

Los datos guardados están formados por Bundle y Serializable y todos se ven bien.

Voy a hacer lo siguiente:

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

¿Cómo puedo entender qué tipo es en realidad para el desplazamiento parcelable?


En mi caso, fue causado por un tamaño de datos que excede el límite máximo que se puede colocar en Parcel, que es de aproximadamente 1 MB.

Solución: optimice su código Parcelable para poner la menor cantidad de datos posible (por ejemplo, no coloque objetos Serializable en Parcela)


En mi caso, mi clase no agregó el archivo CREATOR al extenderse de otro padre Parcelable.

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

En ImageChild falta el campo CREADOR


En mi caso, se arregla después de actualizar la biblioteca de soporte a 23.2.1



Hay algunas reglas para escribir y leer parcelables.

1- Tenga cuidado con la falta de coincidencia de tipo. Si escribe int, no intente leer mucho, etc.

2- Ten cuidado con el orden de escritura y lectura. Los objetos deben estar en el mismo orden al leer y escribir.

Ambos pueden causar "código de tipo desconocido Unmarshalling".


No es un problema relacionado con Proguard. Pero cuando Proguard y Minify habilitan su problema, siempre es así.

El problema está en la secuencia de escritura y lectura del objeto ... la secuencia debería ser la misma, ya que es como leer un archivo.

Puede usar el complemento de Android Studio para hacer la clase como parcelable https://plugins.jetbrains.com/plugin/7332?pr=


Si se agrega un tipo de Lista, debería ser:

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

y descomprímelo usando el tipo de clase como este:

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


Simplemente elimine todos los métodos parcelables y vuelva a generarlos con una secuencia válida


Usando Kotlin, el objeto ''Nota'' tiene un objeto personalizado ''CentroCusto'' que contiene solo propiedades primitivas.

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

La clase CentroCusto:

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