2010-05-27 9 views
12

Sto cercando consigli per accelerare le prestazioni di serializzazione, in particolare quando si utilizza Google Android. Per un progetto su cui sto lavorando, sto cercando di ritrasmettere un paio di centinaia di oggetti da un server all'app per Android e sto passando attraverso varie fasi per ottenere le prestazioni di cui ho bisogno.Prestazioni di serializzazione e Google Android

Per prima cosa ho provato un parser XML terribile che ho hackerato usando lo scanner appositamente per questo progetto, e che ha causato prestazioni incredibilmente lente durante il caricamento degli oggetti (~ 5 minuti per un file 300KB). Poi mi sono allontanato da quello e ho reso le mie classi implementabili in Serializable e ho scritto la lista degli oggetti che avevo in un file. Leggendo quel file negli oggetti, l'Android, con il file già scaricato, richiedeva circa 15-30 secondi per il file serializzato da ~ 100KB. Trovo ancora del tutto inaccettabile per un'app Android, poiché la mia app richiede il caricamento dei dati all'avvio dell'applicazione.

Ho letto brevemente su Externalizable e su come può aumentare le prestazioni, ma non sono sicuro di come lo si implementa con classi nidificate. Al momento, sto cercando di memorizzare un ArrayList della seguente classe, con le classi nidificate sotto di esso.

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

E la classe Sede:

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

E la classe FoodItem:

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

SE Externalizable è la strada da percorrere per aumentare le prestazioni, c'è qualche informazione su come java chiama i metodi negli oggetti quando provi a scriverlo? Non sono sicuro di doverlo implementare nella classe genitore, né come fare per serializzare gli oggetti nidificati all'interno di ogni oggetto.

risposta

10

Non utilizzare mai Serializable attraverso le architetture. Non hai modo di sapere se Dalvik VM avrà serializzazione compatibile con la versione Java del tuo server. Anche se funziona oggi, potrebbe non con aggiornamenti su entrambe le estremità. Scegli sempre qualcosa che è stato progettato specificamente per lavorare su architetture.

Le opzioni includono:

  • buffer protocollo
  • Apache Thrift (confezione payload, non necessariamente la roba RPC)
  • XML (si trascurato di parlare di quello che parser è stato utilizzato - se è stato utilizzato DOM , provare SAX)
  • JSON (riferito il parser JSON Jackson è più veloce del parser org.json integrato in Android)

Inoltre, il caricamento di 300K di dati all'avvio dell'app è una prescrizione per problemi. Si prega di prendere in considerazione l'utilizzo di SQLite per consentire di lavorare con solo i bit di dati necessari alla volta.

+0

Non sono sicuro di aver capito quel commento: con 'Serializable' non devi fare affidamento sul meccanismo predefinito. Puoi sempre definire il tuo con 'readFields()' et al. –

+1

E si presuppone che quei campi siano coerentemente codificati tra architetture. La serializzazione è progettata per l'archiviazione di una singola macchina, non tra le macchine, e tanto meno tra i chipset e gli autori VM. – CommonsWare

+0

Ho passato a un database SQLite come suggerito, e i tempi di caricamento per l'applicazione sono drasticamente migliori. Tuttavia, la compilazione del database richiede ancora molto tempo. Con l'attuale design del database sono state aggiunte ~ 3000 righe quando compiliamo il database, nonché quando aggiungiamo nuovi contenuti.~ 2500 a un tavolo, ~ 500 a un altro e ~ 150 a un terzo. C'è qualcosa che potrebbe essere sbagliato in questo senso? Probabilmente è stato necessario almeno un minuto per aggiungere le righe al database. L'unica cosa che mi viene in mente è ridisegnare il nostro utilizzo del database, quindi non abbiamo bisogno di così tanti –

Problemi correlati