Подтвердить что ты не робот

Как сортировать и развязывать Parcelable в массив байтов с помощью Parcel?

Я хочу, чтобы marshall и unmarshall класс, который реализует Parcelable в/из массива байтов. Мне хорошо известно, что Parcelable-представление нестабильно и поэтому не предназначено для долговременного хранения экземпляров. Но у меня есть вариант использования, где мне нужно сериализовать объект, а это не showstopper если unmarshalling терпит неудачу из-за внутреннего изменения Android. Также класс уже реализует интерфейс Parcelable.

Учитывая класс MyClass implements Parcelable, как я могу (ab) использовать интерфейс Parcelable для сортировки/отмены сортировки?

4b9b3361

Ответ 1

Сначала создайте вспомогательный класс 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 вы можете marshall/unmarshall экземпляров вашего класса MyClass implements Parcelable следующим образом:

Unmarshalling (с CREATOR)

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

Unmarshalling (без 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);

Ответ 2

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