Soweit ich weiß, gehört es zur Art Bundle
und Parcelable
Weise, wie Android die Serialisierung durchführt. Es wird beispielsweise zum Übertragen von Daten zwischen Aktivitäten verwendet. Ich frage mich jedoch, ob die Verwendung Parcelable
anstelle der klassischen Serialisierung Vorteile bietet, wenn beispielsweise der Status meiner Geschäftsobjekte im internen Speicher gespeichert wird. Wird es einfacher oder schneller sein als der klassische Weg? Wo soll ich klassische Serialisierung verwenden und wo besser Bundles verwenden?
quelle
getBundle
Methode und rufe diese vonwriteToParcel
as auf.dest.writeBundle(getBundle());
Beide Optionen stehen automatisch im Objekt zur Verfügung. Es gibt interessanteSerializable
ist komisch langsam auf Android. Borderline in vielen Fällen sogar nutzlos.Parcel
undParcelable
sind fantastisch schnell, aber seine Dokumentation besagt, dass Sie es nicht für die allgemeine Serialisierung zum Speicher verwenden dürfen, da die Implementierung je nach Android-Version unterschiedlich ist (dh ein Betriebssystem-Update kann eine App beschädigen, die darauf angewiesen ist).Die beste Lösung für das Problem, Daten mit einer angemessenen Geschwindigkeit in den Speicher zu serialisieren, besteht darin, Ihre eigenen Daten zu rollen. Ich persönlich verwende eine meiner eigenen Utility-Klassen, die eine ähnliche Schnittstelle hat
Parcel
und alle Standardtypen sehr effizient serialisieren kann (auf Kosten der Typensicherheit). Hier ist eine gekürzte Version davon:quelle
Sehen Sie, wie schnell Parcelable als Serializable ist.
von WARUM WIR PAKETBAR LIEBEN
von Parcelable vs Serializable
quelle
Wenn Sie eine Serialisierung für Speicherzwecke benötigen, aber den Geschwindigkeitsverlust der Reflexion durch die serialisierbare Schnittstelle vermeiden möchten, sollten Sie explizit Ihr eigenes Serialisierungsprotokoll mit der externisierbaren Schnittstelle erstellen.
Bei ordnungsgemäßer Implementierung entspricht dies der Geschwindigkeit von Parcelable und berücksichtigt auch die Kompatibilität zwischen verschiedenen Versionen von Android und / oder der Java-Plattform.
Dieser Artikel könnte auch Dinge klären:
Was ist der Unterschied zwischen Serializable und Externalizable in Java?
Nebenbei bemerkt, es ist auch die schnellste Serialisierungstechnik in vielen Benchmarks und schlägt Kryo, Avro, Protocol Buffers und Jackson (json):
http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
quelle
Es scheint, dass heutzutage der Unterschied nicht so auffällig ist, zumindest nicht, wenn Sie ihn zwischen Ihren eigenen Aktivitäten ausführen.
Laut den auf dieser Website gezeigten Tests ist Parcelable auf den neuesten Geräten (wie Nexus 10) etwa 10-mal schneller und auf alten Geräten (wie Wunsch Z) etwa 17-mal schneller.
Es liegt also an Ihnen, zu entscheiden, ob es sich lohnt.
Vielleicht ist Serializable für relativ kleine und einfache Klassen in Ordnung, und für den Rest sollten Sie Parcelable verwenden
quelle
Parcelable bezieht sich hauptsächlich auf IPC unter Verwendung der Binder- Infrastruktur, bei der Daten als Pakete übergeben werden .
Da Android für die meisten, wenn nicht alle IPC-Aufgaben stark auf Binder angewiesen ist, ist es sinnvoll, Parcelable an den meisten Stellen und insbesondere im Framework zu implementieren, da Sie bei Bedarf ein Objekt an einen anderen Prozess übergeben können. Es macht Objekte "transportabel".
Wenn Sie jedoch eine nicht Android-spezifische Geschäftsschicht haben, die häufig serialisierbare Dateien zum Speichern von Objektzuständen verwendet und diese nur im Dateisystem speichern muss, ist die serialisierbare Funktion meiner Meinung nach in Ordnung. Dadurch kann der Code für die Paketkesselplatte vermieden werden.
quelle
Basierend auf diesem Artikel http://www.mooproductions.org/node/6?page=5 Parcelable schneller sein.
In diesem Artikel wird nicht erwähnt, dass ich nicht denke, dass serialisierbare Objekte in AIDL für Remotedienste funktionieren.
quelle
Ich verwende nur GSON -> Serialisieren in JSON-Zeichenfolge -> Objekt aus JSON-Zeichenfolge wiederherstellen.
quelle
Parcelable bietet auch eine benutzerdefinierte Implementierung, bei der der Benutzer die Möglichkeit erhält, jedes seiner Objekte durch Überschreiben von writeToParcel () zu parzellieren. Bei der Serialisierung wird diese benutzerdefinierte Implementierung jedoch nicht verwendet, da die Datenübergabe eine JAVA-Reflektions-API umfasst.
quelle