2014-05-08 9 views
7

Ho usato gli oggetti serializzabili per salvarli in filesytem e li ho letti per fare tutto ciò che voglio. Ma la serializzazione è lenta quando devi passare i dati tra le attività, quindi ho letto che è consigliabile utilizzare Parcelable. Poi l'ho fatto e sì è più veloce! Ma ora, ho un piccolo problema. Dal momento che Parcelable è ottimizzato per IPC, non sono serializzabili e non possono essere salvati in un file. Quindi vorrei sapere se è possibile farlo.Android - Salva i dati parcelable in un file

Inoltre, se decido di implementare sia l'interfaccia Parcelable che Serializable per la mia classe, ma utilizzo solo Parcelable per passare i dati tra le mie attività, sarei in grado di salvare la classe in un file. Ma credo che da quando uso serializzabile (solo per salvare, non per passare i dati), questa non è una buona idea ronzio?

Ho pensato anche di usare la libreria Gson, serializzare i dati dalla classe e salvare il JSON in un file e riutilizzare Gson per deserializzare JSON per ottenere il mio oggetto Parcelable. Sembra essere una buona idea? Che dire delle prestazioni?

Grazie a tutti per le vostre risposte!

J.

risposta

5

Basta fare context.getFilesDir() e utilizzare un java.io.ObjectInputStream e java.io.ObjectOutputStream.

Inoltre, per quanto riguarda "Parcelable not now serializable". Questo non ha molto senso da Parcelable in un'interfaccia, non da una classe che estendi.

Quindi,

class MyClass implements Parcelable, Serializable { 
} 

dovrebbe funzionare bene. Una volta letto e scritto l'oggetto nel file system, l'interfaccia Parcelable continuerà a funzionare. È solo un'interfaccia.

Devo ammettere che non l'ho provato, ma è quello che ho scritto oggi e scriverò il test unitario domani.

Spero che questo aiuti.

+1

L'implementazione di entrambe le interfacce è un problema quando si utilizza la classe in intent, poiché la chiamata putExtra() è ora ambigua - non sa se si sta chiamando putExtra (name, parcelable) o putExtra (name, serializable) – jhm

+1

@jhm 'intent.putExtra (nome, oggetto (Parcelable))' – TalkLittle

+0

James Barwick grazie mille, la tua risposta mi ha fatto risparmiare un sacco di tempo: D –

-1

Hai provato a utilizzare le preferenze condivise? Se è necessario memorizzare i valori chiave. Inoltre sarà un XML.

+0

Grazie Robert per la risposta. Ci ho pensato, ma se ho una grande classe, se la serializzo, il JSON potrebbe essere grande, quindi non sono sicuro che sia un buon modo per memorizzarlo in SharedPreferences ... Ho letto che SharedPreferences deve essere usato per memorizzare preferenze, non proprio dati, specialmente se sono grandi. – ejay

+0

Quindi immagino per i big data dovresti usare il database – Robert

+1

Dopo aver letto la tua prima risposta, ho letto questo: http://engineering.meetme.com/2014/03/android-tricks-and-tips-storing-a-pojo- in-shared-preferences/ Forse finalmente è una buona idea no? – ejay

2

Ecco un altro approccio se, come dici tu, c'è un conflitto tra le interfacce Parcelable e Serializable. (Anche in questo caso, che non ha senso, ma mi fido di voi fino a quando ho finito il mio test di unità di domani) ...

pensare a questo:

Parcel p = Parcel.obtain(); 

    p.writeValue(asset); 

    p.setDataPosition(0); 

    byte [] b = p.marshall(); 

    p.recycle(); 

OOPS, basta leggere il Javadoc per marshall() e dice NON MEMORIZZARE A DISCO. Dice anche "Usa la serializzazione standard per archiviare su disco" (parafrasi).

Quindi, la mia prima risposta dovrebbe farlo per voi.

Problemi correlati