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

Flo*_*low 41 android marshalling unmarshalling parcel parcelable

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

给定一个类MyClass implements Parcelable,我如何(ab)使用Parcelable接口进行编组/解组?

Flo*_*low 119

首先创建一个帮助器类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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

解组(带CREATOR)

byte[] bytes = …
MyClass myclass = ParcelableUtil.unmarshall(bytes, MyClass.CREATOR);
Run Code Online (Sandbox Code Playgroud)

解组(没有CREATOR)

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

编组

MyClass myclass = …
byte[] bytes = ParcelableUtil.marshall(myclass);
Run Code Online (Sandbox Code Playgroud)

  • `parcel.setDataPosition(0); //这非常重要!"这对我很有帮助.这个Android文档的缺失,真的很糟糕. (4认同)
  • 然而,这种方法的唯一问题是解组实现 Parcelable 的类的子类不会那么简单。您需要传递额外的信息,从中可以判断要使用的正确创建者。 (2认同)