46

Parcelableバイト配列との間で実装するクラスをマーシャリングおよびアンマーシャリングしたいと考えています。私は、Parcelable 表現が安定していないため、インスタンスの長期保存を意図していないという事実を十分に認識しています。しかし、オブジェクトをシリアル化する必要があるユースケースがあり、内部の Android の変更が原因でアンマーシャリングが失敗した場合、それはショーストッパーではありません。また、クラスはすでにParcelableインターフェースを実装しています。

class が与えられた場合、マーシャリング/アンマーシャリングのためにインターフェイスMyClass implements Parcelableを (ab) 使用するにはどうすればよいですか?Parcelable

4

2 に答える 2

134

まず、ヘルパー クラス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;
    }
}

MyClass implements Parcelable上記の util クラスの助けを借りて、クラスのインスタンスを次のようにマーシャリング/アンマーシャリングできます。

アンマーシャリング (を使用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);
于 2013-08-01T16:54:37.850 に答える