Depuis «Pro Android 2»
REMARQUE: voir Parcelable peut avoir déclenché la question, pourquoi Android n'utilise-t-il pas le mécanisme de sérialisation Java intégré? Il s'avère que l'équipe Android est parvenue à la conclusion que la sérialisation en Java est bien trop lente pour satisfaire les exigences de communication interprocessus d'Android. L'équipe a donc créé la solution Parcelable. L'approche Parcelable nécessite que vous sérialisiez explicitement les membres de votre classe, mais au final, vous obtenez une sérialisation beaucoup plus rapide de vos objets.
Sachez également qu'Android fournit deux mécanismes qui vous permettent de transmettre des données à un autre processus. La première consiste à transmettre un bundle à une activité à l'aide d'un intent, et la seconde à transmettre un Parcelable à un service. Ces deux mécanismes ne sont pas interchangeables et ne doivent pas être confondus. Autrement dit, le Parcelable n'est pas destiné à être transmis à une activité. Si vous souhaitez démarrer une activité et lui transmettre des données, utilisez un bundle. Parcelable est destiné à être utilisé uniquement dans le cadre d'une définition AIDL.
getBundle
méthode, puis l'appelle depuiswriteToParcel
asdest.writeBundle(getBundle());
et les deux options sont automatiquement disponibles dans l'objet. Il y a des fonctionnalités de parcelles intéressantes pour les objets vivants notées ici: developer.android.com/reference/android/os/Parcel.htmlSerializable
est comiquement lent sur Android. Borderline inutile dans de nombreux cas en fait.Parcel
etParcelable
sont incroyablement rapides, mais sa documentation indique que vous ne devez pas l'utiliser pour une sérialisation générale vers le stockage, car l'implémentation varie selon les différentes versions d'Android (c'est-à-dire qu'une mise à jour du système d'exploitation pourrait casser une application qui en dépendait).La meilleure solution pour le problème de la sérialisation des données vers le stockage à une vitesse raisonnable est de lancer la vôtre. J'utilise personnellement l'une de mes propres classes d'utilitaires qui a une interface similaire à
Parcel
et qui peut sérialiser tous les types standard très efficacement (au détriment de la sécurité des types). En voici une version abrégée:la source
Voyez à quel point Parcelable est plus rapide que Serializable.
de POURQUOI NOUS AIMONS PARCELABLE
de Parcelable vs Serializable
la source
Si vous avez besoin d'une sérialisation à des fins de stockage, mais que vous voulez éviter la pénalité de vitesse de réflexion encourue par l' interface Serializable , vous devez créer explicitement votre propre protocole de sérialisation avec l' interface Externalizable .
Lorsqu'il est correctement mis en œuvre, cela correspond à la vitesse de Parcelable et tient également compte de la compatibilité entre les différentes versions d'Android et / ou de la plate-forme Java.
Cet article pourrait également clarifier les choses:
Quelle est la différence entre Serializable et Externalizable en Java?
En passant, c'est aussi la technique de sérialisation la plus rapide dans de nombreux benchmarks, battant Kryo, Avro, Protocol Buffers et Jackson (json):
http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
la source
Il semble que de nos jours, la différence n'est pas si notable, du moins pas lorsque vous l'exécutez entre vos propres activités.
Selon les tests présentés sur ce site Web , Parcelable est environ 10 fois plus rapide sur les appareils les plus récents (comme le nexus 10) et environ 17 plus rapide sur les anciens (comme le desire Z)
c'est donc à vous de décider si cela en vaut la peine.
peut-être pour les classes relativement petites et simples, Serializable est bien, et pour le reste, vous devriez utiliser Parcelable
la source
Parcelable est principalement lié à IPC en utilisant l' infrastructure Binder , où les données sont transmises sous forme de colis .
Étant donné qu'Android s'appuie beaucoup sur Binder pour la plupart, sinon la totalité, des tâches IPC, il est logique d'implémenter Parcelable dans la plupart des endroits, et en particulier dans le cadre, car cela permet de passer un objet à un autre processus si vous en avez besoin. Il rend les objets «transportables».
Mais si vous avez une couche métier non spécifique à Android qui utilise largement les sérialisables pour enregistrer les états des objets et n'a besoin de les stocker que dans le système de fichiers, alors je pense que la sérialisable est bien. Il permet d'éviter le code de la plaque chauffante colisable.
la source
Basé sur cet article http://www.mooproductions.org/node/6?page=5 Parcelable devrait être plus rapide.
Ce n'est pas mentionné dans l'article, c'est que je ne pense pas que les objets sérialisables fonctionneront dans AIDL pour les services à distance.
la source
J'utilise juste GSON -> Serialise to JSON String -> Restore Object from JSON String.
la source
Parcelable propose également une implémentation personnalisée où l'utilisateur a la possibilité de parcelliser chacun de ses objets en remplaçant le writeToParcel (), mais la sérialisation ne permet pas cette implémentation personnalisée car sa manière de transmettre les données implique l'API de réflexion JAVA.
la source