android - porque - ¿Cómo ordenar y separar una matriz parcelable a byte con la ayuda de Parcel?
division de matrices online (2)
Primero crea una clase auxiliar 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;
}
}
Con la ayuda de la clase util anterior, puede ordenar / deshacer instancias de su clase. MyClass implements Parcelable
manera:
Unmarshalling (con CREATOR)
byte[] bytes = …
MyClass myclass = ParcelableUtil.unmarshall(bytes, MyClass.CREATOR);
Unmarshalling (sin 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);
Quiero gestionar y deshacer una clase que implementa Parcelable
a / desde una matriz de bytes. Soy consciente del hecho de que la representación parcelable no es estable y, por lo tanto, no está destinada al almacenamiento de instancias a largo plazo. Pero tengo un caso de uso en el que necesito serializar un objeto y no es sorprendente si falla la desasignación debido a un cambio interno de Android. Además, la clase ya está implementando la interfaz Parcelable
.
Dada una clase que MyClass implements Parcelable
, ¿cómo puedo (ab) usar la interfaz Parcelable
para ordenar / desasignar?
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);