web-dev-qa-db-fra.com

Comment marshaller et démarshaller un Parcelable à un tableau d'octets avec l'aide de Parcel?

Je veux rassembler et désarchiver une classe qui implémente Parcelable vers/depuis un tableau d'octets. Je suis bien conscient du fait que la représentation Parcelable n'est pas stable et n'est donc pas destinée au stockage à long terme des instances. Mais j'ai un cas d'utilisation où j'ai besoin de sérialiser un objet et ce n'est pas un showstopper si le dé-marshalling échoue en raison d'un changement interne de Android. De plus, la classe implémente déjà l'interface Parcelable.

Étant donné une classe MyClass implements Parcelable, comment puis-je (ab) utiliser l'interface Parcelable pour le marshaling/unmarshalling?

41
Flow

Créez d'abord une classe d'assistance 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;
    }
}

Avec l'aide de la classe util ci-dessus, vous pouvez marshaller/démarshaller les instances de votre classe MyClass implements Parcelable ainsi:

nmarshalling (avec CREATOR)

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

nmarshalling (sans CREATOR)

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

Marshalling

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