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?
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);