2010-08-31 10 views
50

Ho letto un sacco di post e articoli che esaltano la velocità di Parcelable su Serializable. Ho utilizzato entrambi per un po 'per passare i dati tra le attività tramite Intenti e non ho ancora notato alcuna differenza di velocità quando si passa da uno all'altro. La quantità tipica di dati che devo trasferire è da 5 a 15 oggetti nidificati con da 2 a 5 campi ciascuno.L'utilizzo di Serializable in Android è scorretto?

Dato che ho circa 30 classi che devono essere trasferibili, l'implementazione di Parcelable richiede molto codice boilerplate che aggiunge tempi di manutenzione. Uno dei miei requisiti attuali è anche che il codice compilato dovrebbe essere il più piccolo possibile; Mi aspetto di risparmiare spazio utilizzando Serializable su Parcelable.

Devo utilizzare Parcelable o non c'è motivo di usarlo su Serializable per quantità così piccole di dati? O c'è un'altra ragione per cui non dovrei usare Serializable?

+0

Avete testato la differenza di velocità su un dispositivo a bassa potenza? La differenza di velocità è reale .. –

risposta

59

Per l'utilizzo in memoria, Parcelable è di gran lunga migliore di Serializable. Consiglio vivamente di non usare Serializable.

Non è possibile utilizzare Parcelable per i dati che verranno memorizzati su disco (perché non ha buone garanzie sulla consistenza dei dati quando le cose cambiano), tuttavia Serializable è lento abbastanza che vorrei fortemente esortare a non usarlo lì . Stai meglio scrivendo i dati da solo.

Inoltre, uno dei problemi di prestazioni con Serializable è che termina di girare un sacco di oggetti temporanei, causando molte attività GC nella tua app. È piuttosto atroce. :}

+0

Hai assolutamente ragione. Tuttavia puoi sempre persisterlo convertendolo in una stringa JSON. – johan

+0

Se stai dicendo di mantenere un * pacchetto * in una stringa JSON ... no, no non puoi.Ricodificarlo come una stringa JSON non cambia il fatto che i dati al suo interno non hanno garanzie sulla coerenza dei dati con le cose cambiano o hanno un formato che è garantito essere lo stesso per tutte le versioni della piattaforma. – hackbod

+0

Non persistere il pacco. Ma puoi mantenere l'oggetto. – johan

50

Continua a utilizzare la serializzazione. Vedrete molte persone online che vi diranno che la serializzazione è molto lenta e inefficiente. È corretto. Ma, una cosa che non vorresti mai fare come programmatore di computer è prendere in considerazione qualsiasi commento sulle prestazioni come assoluto.

Chiediti se la serializzazione sta rallentando il programma. Ti accorgi quando passa da un'attività all'altra? Ti accorgi quando salva/carica? In caso contrario, va bene. Non si otterrà un ingombro minore quando si passa a un sacco di codice di serializzazione manuale, quindi non vi è alcun vantaggio. Quindi cosa succede se è 100 volte più lento di un'alternativa se 100 volte più lento significa 10 ms anziché 0,1 ms? Non vedrai nessuno dei due, quindi a chi importa? E perché qualcuno dovrebbe investire un grande sforzo nella scrittura di serializzazione manuale per 30 classi quando non farà alcuna differenza percepibile nelle prestazioni?

+2

Ancora meglio, secondo le mie osservazioni, la normale serializzazione di Java (se fatta bene) è molto più veloce di Parcelable. Vedi i dettagli nella mia risposta qui sotto. – nucleo

16

Tutti affermano ciecamente che Parcelable è migliore e più veloce di Serializable, ma nessuno ha provato a supportare le sue affermazioni con alcuna prova. Ho deciso di testarlo da solo e ho ottenuto risultati molto interessanti.

La serializzazione Java su un dispositivo Android medio (se eseguita correttamente) è circa 3,6 volte più veloce di Parcelable per le scritture e circa 1,6 volte più veloce per le letture.

È possibile controllare il mio progetto di test qui: https://bitbucket.org/afrishman/androidserializationtest

+1

http://www.developerphil.com/parcelable-vs-serializable/ – damson

+2

@damson Ecco perché lo chiamo "serializzazione fatta bene". Nell'articolo sopra, a cui tutti fanno riferimento, la serializzazione non viene utilizzata in tutto il suo potenziale. Questo è un confronto ingiusto. Nel mio benchmark ho cercato di renderlo più giusto e i risultati sono completamente diversi. Il problema è che tutti "dimenticano" i metodi writeObject()/readObject() che consentono di rendere la serializzazione integrata Java veloce come un fulmine senza problemi di piattaforma specifici come Parcelable. – nucleo

+3

Sono assolutamente d'accordo. E in realtà mi sento, ci sono sia equivalenti utili e silenziosi, ma solo a seconda dello scenario della tua app. Ecco un altro articolo che mette in luce questa volta su Serializable http://nemanjakovacevic.net/blog/english/2015/03/24/yet-another-post-on-serializable-vs-parcelable/ – damson

0

Qualcuno ha considerato la serializzazione utilizzando JSON e passando i dati come una stringa? GSON e Jackson dovrebbero essere abbastanza efficienti da essere un concorrente di Parcelable e Serializable.

Problemi correlati