web-dev-qa-db-fra.com

Utilisation de Serializable sous Android est-elle incorrecte?

J'ai lu de nombreux articles et articles vantant la vitesse de Parcelable par rapport à Serializable. Cela fait un moment que j'utilise les deux pour transmettre des données entre les activités et entre les intentions, et je n’ai encore remarqué aucune différence de vitesse lors du basculement entre les deux. La quantité typique de données que je dois transférer est de 5 à 15 objets imbriqués de 2 à 5 champs chacun.

Comme j'ai environ 30 classes qui doivent être transférables, l'implémentation de Parcelable nécessite beaucoup de code passe-partout qui ajoute du temps de maintenance. Une de mes exigences actuelles est également que le code compilé soit aussi petit que possible. Je pense pouvoir économiser de l’espace en utilisant Serializable over Parcelable.

Devrais-je utiliser Parcelable ou n'y a-t-il aucune raison de l'utiliser avec Serializable pour de si petites quantités de données? Ou existe-t-il une autre raison pour laquelle je ne devrais pas utiliser Serializable?

53
Alpha Hydrae

Pour une utilisation en mémoire, Parcelable est bien meilleur que Serializable. Je recommande fortement de ne pas utiliser Serializable.

Vous ne pouvez pas utiliser Parcelable pour les données qui seront stockées sur disque (car la cohérence des données en cas de changement est mal garantie), cependant, Serializable est suffisamment lent pour que je vous déconseille vivement de ne pas l'utiliser là non plus. Vous feriez mieux d'écrire les données vous-même.

En outre, l'un des problèmes de performances avec Serializable est qu'il finit par effectuer une rotation dans de nombreux objets temporaires, ce qui génère une activité GC importante dans votre application. C'est assez odieux. :}

63
hackbod

Continuer à utiliser la sérialisation. Vous verrez beaucoup de gens en ligne qui vous diront que la sérialisation est très lente et inefficace. C'est correct. Cependant, une chose que vous ne voulez jamais faire en tant que programmeur informatique est de prendre n'importe quel commentaire sur la performance en absolu.

Demandez-vous si la sérialisation ralentit votre programme. Avez-vous remarqué quand cela passe d'une activité à l'autre? Avez-vous remarqué quand il sauve/charge? Sinon, c'est bien. Vous n'obtiendrez pas moins d'empreinte lorsque vous utiliserez beaucoup de code de sérialisation manuelle, il n'y a donc aucun avantage. Alors, que se passe-t-il s’il est 100 fois plus lent qu’une alternative si 100 fois plus lente signifie 10 ms au lieu de 0,1 ms? Tu ne vas pas voir non plus, alors qui s'en soucie? Et pourquoi quelqu'un investirait-il des efforts considérables dans l'écriture de la sérialisation manuelle pour 30 classes alors que cela ne ferait aucune différence perceptible dans les performances?

52
Charles

Tout le monde affirme aveuglément que Parcelable est meilleur et plus rapide que Serializable, mais personne n’a essayé d’appuyer ses déclarations avec des preuves. J'ai décidé de tester cela moi-même et j'ai eu des résultats très intéressants.

La sérialisation Java habituelle sur un périphérique Android moyen (si elle est correctement effectuée) est environ 3,6 fois plus rapide que Parcelable pour les écritures et environ 1,6 fois plus rapide pour les lectures.

Vous pouvez vérifier mon projet test ici: https://bitbucket.org/afrishman/androidserializationtest

16
nucleo

Quelqu'un a-t-il envisagé la sérialisation à l'aide de JSON et la transmission des données sous forme de chaîne? GSON et Jackson devraient être suffisamment efficaces pour concurrencer Parcelable et Serializable.

0
Johan