Jak rozumiem Bundle
i Parcelable
należy do sposobu, w jaki Android wykonuje serializację w. Jest używany na przykład w przekazywaniu danych między działaniami. Ale zastanawiam się, czy są jakieś korzyści z używania Parcelable
zamiast klasycznej serializacji, na przykład w przypadku zapisywania stanu moich obiektów biznesowych do pamięci wewnętrznej? Czy będzie to prostsze czy szybsze niż klasyczny sposób? Gdzie należy używać klasycznej serializacji, a gdzie lepiej używać pakietów?
źródło
getBundle
metodę, a następnie wywołuję ją zwriteToParcel
asdest.writeBundle(getBundle());
i mam obie opcje dostępne w obiekcie automatycznie. Tutaj odnotowano interesujące funkcje Parcel dla obiektów na żywo: developer.android.com/reference/android/os/Parcel.htmlSerializable
działa komicznie wolno na Androidzie. W rzeczywistości w wielu przypadkach jest to bezużyteczne.Parcel
iParcelable
są fantastycznie szybkie, ale ich dokumentacja mówi, że nie wolno ich używać do serializacji ogólnego przeznaczenia do pamięci masowej, ponieważ implementacja różni się w różnych wersjach Androida (tj. aktualizacja systemu operacyjnego może zepsuć aplikację, która na niej polegała).Najlepszym rozwiązaniem problemu serializacji danych do pamięci z rozsądną szybkością jest przeniesienie własnej. Osobiście używam jednej z moich własnych klas narzędziowych, która ma podobny interfejs
Parcel
i może bardzo efektywnie serializować wszystkie standardowe typy (kosztem bezpieczeństwa typów). Oto skrócona wersja:źródło
Zobacz, jak szybki jest Parcelable niż Serializable.
od DLACZEGO KOCHAMY PARCELABLE
od Parcelable vs Serializable
źródło
Jeśli potrzebujesz serializacji, np. Do celów przechowywania, ale chcesz uniknąć kary za szybkość refleksji wynikającej z interfejsu Serializable , powinieneś jawnie utworzyć własny protokół serializacji z interfejsem Externalizable .
Po prawidłowym wdrożeniu odpowiada to szybkości Parcelable, a także zapewnia kompatybilność między różnymi wersjami Androida i / lub platformy Java.
Ten artykuł może również wyjaśnić sprawę:
Jaka jest różnica między Serializable a Externalizable w Javie?
Na marginesie jest to również najszybsza technika serializacji w wielu testach porównawczych, pokonując Kryo, Avro, Protocol Buffers i Jacksona (json):
http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
źródło
Wydaje się, że w dzisiejszych czasach różnica nie jest tak zauważalna, przynajmniej nie wtedy, gdy prowadzisz ją między własnymi działaniami.
Zgodnie z testami pokazanymi na tej stronie , Parcelable jest około 10 razy szybszy na najnowszych urządzeniach (takich jak Nexus 10) i około 17 razy szybszy na starych (jak pragnienie Z)
więc to do Ciebie należy decyzja, czy warto.
może dla stosunkowo małych i prostych klas, Serializable jest w porządku, a dla reszty powinieneś użyć Parcelable
źródło
Parcelable jest głównie związane z IPC korzystającym z infrastruktury Binder , gdzie dane są przekazywane jako Paczki .
Ponieważ Android w dużej mierze opiera się na Binderze dla większości, jeśli nie wszystkich, zadań IPC, sensowne jest wdrożenie Parcelable w większości miejsc, a zwłaszcza we frameworku, ponieważ pozwala on przekazać obiekt do innego procesu, jeśli tego potrzebujesz. Czyni obiekty „przenośnymi”.
Ale jeśli masz warstwę biznesową, która nie jest specyficzna dla Androida, która szeroko wykorzystuje elementy serializowalne do zapisywania stanów obiektów i potrzebujesz tylko przechowywać je w systemie plików, to myślę, że serializowalny jest w porządku. Pozwala to na uniknięcie kodu kotła Parcelable.
źródło
Według tego artykułu http://www.mooproductions.org/node/6?page=5 Przesyłka powinna być szybsza.
W artykule nie wspomniano, że nie sądzę, że obiekty możliwe do serializacji będą działać w AIDL dla usług zdalnych.
źródło
Po prostu używam GSON -> Serialise to JSON String -> Restore Object from JSON String.
źródło
Parcelable oferuje również niestandardową implementację, w której użytkownik ma szansę spakować każdy ze swoich obiektów przez nadpisanie metody writeToParcel (), jednak serializacja nie jest tą niestandardową implementacją, ponieważ jej sposób przekazywania danych obejmuje interfejs API odbicia JAVA.
źródło