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.
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. –
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
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 –