Android Parcel occurs 'Unmarshalling unknown type code'

Paracel一直以來都用得很順,即使是下列這種複雜的資料結構都OK
A class implements Parcelable {
    private B dataB;
    private ArrayList myList1;
    private ArrayList myList2;

    // 其他省略...

    // region Parcelable
    private A(Parcel parcel) {
        try {
            dataB= parcel.readParcelable(B.class.getClassLoader());
            myList1= parcel.readArrayList(String.class.getClassLoader());
            myList2= parcel.readArrayList(C.class.getClassLoader());
        } catch (Exception e) {
            Log.e("parcelable error", "A class:" + e.toString());
        }
    }

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
        public A createFromParcel(Parcel parcel) {
            return new A(parcel);
        }

        public A[] newArray(int size) {
            return new A[size];
        }
    };

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

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeParcelable(dataB, i);
        parcel.writeList(myList1);
        parcel.writeList(myList2);
    }
    // endregion
}

B class implements Parcelable {
    private String id;
    private String name;
    // 其他省略...
}

C class implements Parcelable {
    private String gender;
    private String age;
    // 其他省略...
}

但最近用一樣的寫法,在A class中實作Parcel的時候,write部分沒問題read部分卻crash並出現錯誤java.lang.RuntimeException: Parcel android.os.Parcel@ffd1087: Unmarshalling unknown type code 7667825 at offset 1152

檢查了三款自訂的Parcel Class A、B、C都有確實實作相關methods,後來看到此篇文章Parcel Unmarshalling unknown type code提到資料的讀寫要按照相同順序,回頭檢查欄位高達四十個的B class才發現順序正確,但是write部分寫了三十六個欄位,read部分卻讀取了三十七個欄位,也因此影響了Parcel A的讀取部分@@

特此紀錄一下,在使用Parcel時要特別注意資料的讀寫順序與個數!!! 


沒有留言: