2013-08-01 5 views
35

Chcę przenieść i usunąć z gry klasę, która implementuje Parcelable do/z tablicy bajtów. Doskonale zdaję sobie sprawę z tego, że reprezentacja Parafialna nie jest stabilna i dlatego nie służy do przechowywania instancji przez długi czas. Ale mam przypadek użycia, w którym muszę serializować obiekt i nie jest to showstopper, jeśli anulowanie niszczenia następuje z powodu wewnętrznej zmiany systemu Android. Również klasa implementuje już interfejs Parcelable.Jak wysłać i rozprowadzić Parceli do tablicy bajtów za pomocą Paczki?

Biorąc pod uwagę klasę MyClass implements Parcelable, w jaki sposób mogę (ab) użyć interfejsu Parcelable do zestawiania/rozpraszania?

Odpowiedz

97

Najpierw utworzyć klasy pomocnika 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; 
    } 
} 

Z pomocą klasy util powyżej, można Marshalla/wycofać instancje klasy MyClass implements Parcelable tak:

Unmarshalling (z CREATOR)

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

Unmarshalling (bez 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); 
+4

'parcel.setDataPosition (0); // to jest niezwykle ważne! "to mi bardzo pomaga. brak tego dokumentu z Androidem jest naprawdę do dupy. –

+0

Dziękuję bardzo za tę wskazówkę. Wdrażanie Parceli (która jest bardzo podatna na błędy i dostaniesz bezsensowne wyjątki czasu wykonywania i złych klientów, jeśli nie zrobisz tego dobrze) jest takim PITA - Unikam Parcelables w moim kodzie w ogóle i używam Serializables. W przypadku współczesnych telefonów prędkość uderzenia jest prawie niezauważalna. –

+1

Jedynym problemem związanym z tym podejściem jest jednak to, że niezamieszczanie podklasy klasy, która implementuje Parcelable, nie będzie tak proste. Musisz podać dodatkowe informacje, z których możesz ocenić właściwego Twórcę, którego będziesz używał. – bosphere

-3
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); 
+2

Proszę podać krótki opis kodu, który wysłałeś, aby ułatwić zrozumienie PO. – Jatin

Powiązane problemy