2010-05-27 8 views
12

Ich bin auf der Suche nach Rat zur Beschleunigung der Serialisierung Leistung, insbesondere bei der Verwendung von Google Android. Für ein Projekt, an dem ich gerade arbeite, versuche ich, ein paar hundert Objekte von einem Server an die Android-App weiterzuleiten und durchlaufe verschiedene Phasen, um die Leistung zu erhalten, die ich brauche.Serialisierung Leistung und Google Android

Zuerst habe ich einen schrecklichen XML Parser ausprobiert, den ich zusammen mit Scanner speziell für dieses Projekt gehackt habe, was beim Laden der Objekte eine unglaublich langsame Performance verursachte (~ 5 Minuten für eine 300KB Datei). Ich entfernte mich dann davon und ließ meine Klassen Serializable implementieren und schrieb die ArrayList von Objekten, die ich hatte, in eine Datei. Lesen dieser Datei in die Objekte der Android, mit der Datei bereits gedownloadet Sie, dauerte ~ 15-30 Sekunden für die ~ 100 KB serialisierte Datei. Für eine Android-App halte ich das immer noch für völlig inakzeptabel, da meine App beim Starten der Anwendung das Laden der Daten erfordert.

Ich habe kurz über Externalizable gelesen und wie es die Leistung erhöhen kann, aber ich bin mir nicht sicher, wie man es mit verschachtelten Klassen implementiert. Im Moment versuche ich eine ArrayList der folgenden Klasse mit den darunter liegenden verschachtelten Klassen zu speichern.

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

und der Veranstaltungsort Klasse:

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

Und die FoodItem Klasse:

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

IF Externalizable die Möglichkeit, die Leistung zu erhöhen, zu gehen, dass Informationen, wie Java gibt es ruft die Methoden in den Objekten auf, wenn Sie versuchen, sie auszugeben? Ich bin nicht sicher, ob ich es in der Elternklasse implementieren muss, noch, wie ich die verschachtelten Objekte in jedem Objekt serialisieren würde.

Antwort

10

Niemals Serializable über Architekturen hinweg verwenden. Sie haben keine Möglichkeit zu wissen, ob die Dalvik-VM eine kompatible Serialisierung mit der Java-Version Ihres Servers hat. Auch wenn es heute funktioniert, könnte es nicht mit Upgrades auf beiden Seiten. Wählen Sie immer etwas aus, das speziell für die Zusammenarbeit über Architekturen entwickelt wurde.

Optionen sind:

  • Protocol Buffers
  • Apache Thrift (die Nutzlast Verpackung, die nicht unbedingt die RPC Sachen)
  • XML (Sie vernachlässigt, was Parser Sie verwendet zu erwähnen - wenn Sie verwendet DOM , versuchen SAX)
  • JSON (angeblich der Jackson JSON-Parser ist schneller als der org.json Parser in Android gebaut)

Außerdem ist das Laden von 300.000 Daten beim Start der App ein Problem. Bitte beachten Sie, dass Sie SQLite nutzen können, um mit den jeweils benötigten Daten zu arbeiten.

+0

Nicht sicher, dass ich diesen Kommentar verstehe - mit 'Serializable' müssen Sie sich nicht auf den Standardmechanismus verlassen. Mit 'readFields()' et al. Können Sie immer eigene definieren. –

+1

Und Sie nehmen an, dass diese Felder einheitlich über Architekturen codiert sind. Die Serialisierung ist für die Speicherung auf einer einzelnen Maschine gedacht, nicht auf Maschinen, ganz zu schweigen von Chipsätzen und VM-Autoren. – CommonsWare

+0

Ich wechselte zu einer SQLite-Datenbank, wie Sie vorgeschlagen haben, und die Ladezeiten für die Anwendung sind drastisch besser. Das Füllen der Datenbank dauert jedoch immer noch sehr viel Zeit. Mit dem aktuellen Datenbankentwurf wurden ~ 3000 Zeilen hinzugefügt, wenn wir die Datenbank füllen, sowie beim Hinzufügen neuer Inhalte.~ 2500 zu einem Tisch, ~ 500 zu einem anderen, und ~ 150 zu einem Drittel. Gibt es irgendetwas, was wir in dieser Hinsicht falsch machen könnten? Es dauerte wahrscheinlich mindestens eine Minute, um die Zeilen zur Datenbank hinzuzufügen. Das einzige, was mir in den Sinn kommt, ist die Neugestaltung unserer Datenbanknutzung, so dass wir nicht so viele brauchen. –