2010-05-27 6 views
12

Je suis à la recherche de conseils pour accélérer les performances de sérialisation, en particulier lorsque vous utilisez Google Android. Pour un projet sur lequel je travaille, j'essaie de relayer quelques centaines d'objets d'un serveur vers l'application Android, et je passe par différentes étapes pour obtenir les performances dont j'ai besoin. J'ai d'abord essayé un analyseur XML terrible que j'ai piraté en utilisant Scanner spécifiquement pour ce projet, et qui a causé des performances incroyablement lentes lors du chargement des objets (~ 5 minutes pour un fichier de 300 Ko). Je me suis ensuite éloigné de cela et fait mes classes implémenter Serializable et écrit la liste d'objets que j'avais dans un fichier. La lecture de ce fichier dans les objets Android, avec le fichier déjà téléchargé à l'esprit, prenait ~ 15-30 secondes pour le fichier sérialisé ~ 100 Ko. Je trouve toujours cela complètement inacceptable pour une application Android, car mon application nécessite de charger les données au démarrage de l'application.Performance de sérialisation et Google Android

J'ai lu brièvement à propos de Externalizable et comment il peut augmenter les performances, mais je ne suis pas sûr de la façon dont on l'implémente avec les classes imbriquées. En ce moment, j'essaie de stocker une ArrayList de la classe suivante, avec les classes imbriquées en dessous.

public class MealMenu implements Serializable{ 
private String commonsName; 
private long startMillis, endMillis, modMillis; 
private ArrayList<Venue> venues; 
private String mealName; 
} 

Et la classe Lieu:

public class Venue implements Serializable{ 
private String name; 
private ArrayList<FoodItem> foodItems; 
} 

Et la classe FoodItem:

public class FoodItem implements Serializable{ 
private String name; 
private boolean vegan; 
private boolean vegetarian; 
} 

IF Externalizable est la voie à suivre pour augmenter les performances, est-il des informations quant à la façon java appelle les méthodes dans les objets lorsque vous essayez de l'écrire? Je ne suis pas sûr si j'ai besoin de l'implémenter dans la classe parente, ni comment j'irais sérialiser les objets imbriqués dans chaque objet.

Répondre

10

N'utilisez jamais Serializable entre architectures. Vous n'avez aucun moyen de savoir si la machine virtuelle Dalvik aura une sérialisation compatible avec la version Java de votre serveur. Même si cela fonctionne aujourd'hui, il se peut que cela ne soit pas le cas avec des mises à niveau à chaque extrémité. Choisissez toujours quelque chose qui est spécifiquement conçu pour fonctionner à travers les architectures.

Les options incluent:

  • Protocol Buffers
  • Apache Thrift (l'emballage de la charge utile, pas nécessairement la substance RPC)
  • XML (vous avez oublié de mentionner ce que l'analyseur que vous avez utilisé - si vous avez utilisé DOM , essayez SAX)
  • JSON (aurait l'analyseur Jackson JSON est plus rapide que l'analyseur de org.json intégré dans Android)

En outre, le chargement de 300 Ko de données au démarrage de l'application est une prescription pour les problèmes. S'il vous plaît envisager de tirer parti de SQLite pour vous permettre de travailler avec les bits de données dont vous avez besoin à la fois.

+0

Je ne suis pas certain de comprendre ce commentaire - avec Serializable, vous n'avez pas besoin de compter sur le mécanisme par défaut. Vous pouvez toujours définir les vôtres avec 'readFields()' et al. –

+1

Et vous supposez que ces champs sont systématiquement codés à travers les architectures. La sérialisation est conçue pour le stockage pour une machine individuelle, pas pour les machines, et encore moins pour les chipsets et les auteurs de VM. – CommonsWare

+0

Je suis passé à une base de données SQLite comme vous l'avez suggéré, et les temps de chargement de l'application sont nettement meilleurs. Toutefois, le remplissage de la base de données prend encore énormément de temps. Avec la conception de la base de données actuelle, nous avons ajouté ~ 3000 lignes lorsque nous remplissons la base de données, ainsi que lors de l'ajout de nouveau contenu.~ 2500 à une table, ~ 500 à l'autre, et ~ 150 à un tiers. Y a-t-il quelque chose que nous pourrions faire de mal à cet égard? Il fallait probablement au moins une minute pour ajouter les lignes à la base de données. La seule chose qui me vient à l'esprit est la refonte de notre base de données afin que nous n'en ayons pas besoin. –