2012-02-17 12 views
30

Więc wiem, że zaleca się używać Parcelable zamiast Serializable w Androidzie, ponieważ jest szybszy.Android Parcelable i Serializable

Moje pytanie brzmi: czy niemożliwe jest uniknięcie prawa do seryjnej selekcji?

Jeśli mam niestandardowego obiektu Chcę serializacji, powiedzmy, że mam następującą definicję klasy

public class Person { 
    String name; 
    int Age; 
    ... 
    .... 
} 

Making to parcelable jest łatwe, ponieważ klasa Person zawiera typy parcel.write *() obsługuje , czyli jest parcel.writeString i parcel.writeInt

teraz co jeśli klasa Osoba jest następujący:

public class PersonTwo { 
    MyCustomObj customObj; 
    String name; 
    int Age; 
    ... 
    .... 
} 

Jak mam załóżmy na równi cel obiektu MyCustomObj? Wydaje się, że muszę ponownie użyć serializacji? ale znowu, myślałem, że jest WOLNY używać serializable, i wydaje się, że nie mamy wyboru, ale użyć go w tym przypadku.

Nie rozumiem

może ktoś mi powiedzieć jak bym Parcel PersonTwo w tym przypadku?

+2

Proponuję użyć Serializable. Zgodnie z testami na Nexusie 5 jest znacznie szybszy niż Parceli. Zobacz https://bitbucket.org/afrishman/androidserializationtest. Najważniejszą rzeczą do zapamiętania jest to, że Serializable działa wolno tylko z ustawieniami domyślnymi. Jeśli używasz ręcznej serializacji, jest to znacznie, znacznie szybciej. Sprawdź powyższy link, aby uzyskać szczegółowe informacje. – nucleo

Odpowiedz

2

Musisz dokonać parowania MyCustomObj.

16

Link podany przez Ajay jest dokładnie tym, czego szukasz, jak możesz to zrobić. Cóż, co można zrobić, to wdrożenie Parcelable do swojego CustomObject1 i stworzyć Parcelable klasę dla niego, a następnie można użyć tego Parcelable klasę Parcel nim wewnątrz innej klasy, która będzie Parcelable Parcel zarówno CustomObjects.

public class CustomObject1 implements Parcelable { 

    // parcelable code CustomObject1 
} 

public class CustomObject2 implements Parcelable { 

    private CustomObject1 obj1; 

    // add CustomObject1 here with getter setter 
    // parcelable code for CustomObject2 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeParcelable(obj1, flags); 
    } 
    private void readFromParcel(Parcel in) { 
     obj1 = in.readParcelable(CustomObject1.class.getClassLoader()); 
    } 
    ............ 
} 
+2

Dzięki stary, przyjąłbym zarówno ciebie, jak i ajay jako odpowiedź, ale wydaje mi się, że mogę wybrać tylko jeden. mimo wszystko dziękuję!! – user1118019

+1

Tak, to jest na miejscu i jak to robię. Po prostu spraw, aby każdy pojedynczy obiekt był wymagany, działał, ponieważ na końcu tego wszystkiego, obiekt główny będzie zawierał prymitywne lub typu String – jonney

-1

Doszedłem do punktu, w którym Parcelable jest problemem dla mnie. Na urządzeniach z systemem Android 4.3, otrzymuję wyjątek od stanu wyjątkowego podczas przesyłania danych między działaniami jako paczek. Działa poprawnie na Androidzie 4,0, 4,2 lub 4,4. Powinien działać po zmianie na Serializable, mimo że jest wolniejszy.

+0

dobrze, to jest to, czego doświadczam i widzę w logcat ... – MartinC

+2

Proszę dodać kod, aby mógł on również sprawdzić jeśli problem leży w samym androidzie. – silverado

0

Wszystkie złożone obiekty również powinny być parcelable. W przypadku, gdy chcesz pominąć obiekt, nie używaj go w metodzie writeToParcel.

Powiązane problemy