How to fix Unmarshalling unknown type code XXX at offset YYY in Android?

北城以北 提交于 2019-11-27 20:05:24

There's some rules for write and read parcelables.

1- Be careful about type mismatch. If you write int, don't try to read long etc.

2- Be careful about order of writes and reads. Objects must be at the same sort order when reading and writing.

Both of these can cause "Unmarshalling unknown type code".

4ntoine

It's because of Proguard obfuscation - it processed Parcelable. solution: Proguard causing RuntimeException (Unmarshalling unknown type code) in Parcelable class

Subhas P

If a type of List is added, it should be:

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

and unparcel it using the class type like this:

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

In my case it is fixed after upgrading support library to 23.2.1

It's not Proguard related issue.. But when proguard and minify enable it's issue occurrence is always.

Problem is in sequence of writing and reading of object...sequence should be same, as it is like reading file.

You can use android studio plug in for make class as parcelable https://plugins.jetbrains.com/plugin/7332?pr=

Just remove all parcelable methods and generate them again with valid sequence

In my case it was caused by data size exceeding max limit of that can be put to Parcel which is about 1 MB.

Solution: optimize your Parcelable code to put as less data as possible (e.g. do not put Serializable objects to Parcel)

In my case my class don't added CREATOR filed when extending from another Parcelable parent.

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

In ImageChild missing CREATOR field

Using Kotlin, the object 'Nota' has a Custom object 'CentroCusto' that contains only primitive properties.

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

The CentroCusto class:

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

}

Just to add: this error can also happen, when using custom views and don't properly save/restore their states via onSaveInstanceState() and onRestoreInstanceState().

So if this error occurs, also check your custom views.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!