我想编组和解组一个实现Parcelable
到/从字节数组的类。我很清楚 Parcelable 表示不稳定,因此不适合长期存储实例。但是我有一个用例,我需要序列化一个对象,如果由于内部 Android 更改而导致解组失败,它就不是一个好主意。该类也已经实现了Parcelable
接口。
给定一个类MyClass implements Parcelable
,我如何(ab)使用Parcelable
接口进行编组/解组?
我想编组和解组一个实现Parcelable
到/从字节数组的类。我很清楚 Parcelable 表示不稳定,因此不适合长期存储实例。但是我有一个用例,我需要序列化一个对象,如果由于内部 Android 更改而导致解组失败,它就不是一个好主意。该类也已经实现了Parcelable
接口。
给定一个类MyClass implements Parcelable
,我如何(ab)使用Parcelable
接口进行编组/解组?
首先创建一个帮助类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;
}
}
在上面的 util 类的帮助下,您可以像这样编组/取消编组您的类的实例MyClass implements Parcelable
:
解组(使用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);
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);