如何在Parcel的帮助下将Parcelable编组并解组为字节数组?

时间:2013-08-01 16:54:38

标签: android marshalling unmarshalling parcelable parcel

我想要对一个字节数组实现Parcelable的类进行编组和解组。 我很清楚Parcelable表示不稳定,因此不适用于实例的长期存储。但我有一个用例,我需要序列化一个对象,它不是一个showstopper如果由于内部Android更改而导致解组失败。该类还在实现Parcelable接口。

鉴于课程MyClass implements Parcelable,我如何(ab)使用Parcelable界面进行编组/解组?

2 个答案:

答案 0 :(得分:115)

首先创建一个帮助类 ParcelableUtil.java

public class ParcelableUtil {    
    public static byte[] marshall(Parcelable parceable) {
        Parcel parcel = Parcel.obtain();
        parceable.writeToParcel(parcel, 0);
        byte[] bytes = parcel.marshall();
        parcel.recycle();
        return bytes;
    }

    public static Parcel unmarshall(byte[] bytes) {
        Parcel parcel = Parcel.obtain();
        parcel.unmarshall(bytes, 0, bytes.length);
        parcel.setDataPosition(0); // This is extremely important!
        return parcel;
    }

    public static <T> T unmarshall(byte[] bytes, Parcelable.Creator<T> creator) {
        Parcel parcel = unmarshall(bytes);
        T result = creator.createFromParcel(parcel);
        parcel.recycle();
        return result;
    }
}

在上面的util类的帮助下,你可以像这样编组/解组你的班级MyClass implements Parcelable的实例:

解组(使用CREATOR

byte[] bytes = …
MyClass myclass = ParcelableUtil.unmarshall(bytes, MyClass.CREATOR);

解组(不含CREATOR

byte[] bytes = …
Parcel parcel = ParcelableUtil.unmarshall(bytes);
MyClass myclass = new MyClass(parcel); // Or MyClass.CREATOR.createFromParcel(parcel).

<强>编组

MyClass myclass = …
byte[] bytes = ParcelableUtil.marshall(myclass);

答案 1 :(得分:-3)

public static byte[] pack(Parcelable parcelable) {
    Parcel parcel = Parcel.obtain();
    parcelable.writeToParcel(parcel, 0);
    byte[] bytes = parcel.marshall();
    parcel.recycle();
    return bytes;
}

public static <T> T unpack(byte[] bytes, Parcelable.Creator<T> creator) {
    Parcel parcel = Parcel.obtain();
    parcel.unmarshall(bytes, 0, bytes.length);
    parcel.setDataPosition(0);
    return creator.createFromParcel(parcel);
}

MyObject myObject = unpack(new byte[]{/* bytes */}, MyObject.CREATOR);