Java: salvare oggetti in un file di testo? Ci sono soluzioni già pronte?
Domanda
Voglio salvare gli oggetti che ho generato in un programma. Dopo il riavvio, l'app dovrebbe caricare automaticamente tutti gli oggetti in un array. Voglio scriverli in un file e analizzarli dopo il riavvio. Le altre possibilità sono più intelligenti di quelle fatte a mano? Grazie
Soluzione
Puoi usare la classe Berkeley DB PersistentMap
per salvare i tuoi oggetti ( Serializable
) in un'implementazione di Map
(una cache) che li persiste in un file. È piuttosto semplice da usare e significa che non devi preoccuparti di cosa salvare dove.
Tre cose da notare sulla serializzazione:
- Come farai con le modifiche dello schema (ovvero cambiando i dati di cui sono composte le tue classi - ad esempio aggiungendo un nuovo campo)
- Cosa succede se i tuoi file vengono danneggiati? A seconda dell'affidabilità della memoria del tuo programma, ciò influenzerà la tua decisione su come salvare i dati che implicitamente contengono i tuoi oggetti. Ricorda, puoi sempre utilizzare un database relazionale come MySQL e quindi convertire questi dati nei tuoi oggetti
- Devi essere in grado di visualizzare o interrogare i dati all'esterno del tuo programma? Cosa succede se si desidera rispondere ad una semplice domanda come " Quanti oggetti hanno la proprietà X? & Quot; Facile da fare se hai utilizzato un database (relazionale); non è così semplice se hai serializzato roba su file!
Altri suggerimenti
Sì, il concetto che stai cercando si chiama serializzazione. C'è un ottimo tutorial su Sun qui .
L'idea è che le classi che vuoi persistere debbano implementare l'interfaccia Serializable. Successivamente si utilizza java.io.ObjectOutputStream.writeObject () per scrivere l'oggetto in un file e java.io.ObjectInputStream.readObject () per rileggerlo.
Non puoi serializzare tutto, poiché ci sono cose che non hanno senso serializzare, ma puoi aggirarle. Ecco una citazione al riguardo:
Il meccanismo di base di Java la serializzazione è semplice da usare, ma ci sono altre cose da sapere Come menzionato prima, solo oggetti contrassegnati Serializable può essere persistito. Il La classe java.lang.Object no implementare quella interfaccia. Perciò, non tutti gli oggetti in Java possono essere persisteva automaticamente. Le buone notizie è che la maggior parte di loro - come AWT e Swing componenti della GUI, stringhe e array: sono serializzabili.
D'altra parte, certo classi a livello di sistema come Thread, OutputStream e le sue sottoclassi e I socket non sono serializzabili. Infatti, non avrebbe alcun senso se lo facessero erano. Ad esempio, thread in esecuzione la mia JVM userebbe quella del mio sistema memoria. Persistendo e cercando di farlo eseguirlo nella tua JVM non avrebbe senso affatto. Un altro punto importante in merito java.lang.Object non implementa il file L'interfaccia serializzabile è quella qualsiasi classe che crei che si estende solo Oggetto (e nessun altro serializzabile classi) non è serializzabile a meno che implementi tu stesso l'interfaccia (come fatto con l'esempio precedente).
Questa situazione presenta un problema: cosa succede se abbiamo una classe che contiene un'istanza di Thread? In quel caso, possiamo mai persistere oggetti di questo genere? La risposta è sì, purché noi dì al nostro meccanismo di serializzazione intenzioni segnando quelle della nostra classe Thread oggetto come transitorio.
Potresti voler controllare Efficace Java per alcuni trucchi per quanto riguarda la serializzazione. Questi sono generalmente avanzati ma se questa funzionalità è una parte fondamentale della tua app, ti consigliamo di conoscerli in anticipo.
Gli esempi includono problemi di sicurezza, ereditarietà e, soprattutto, il potenziale di "congelare" pubblicamente un'API con la realizzazione (ad es. tra versioni di software). Ancora una volta, questi sono tutti avanzati e non dovrebbero scoraggiarti di per sé.
java.io.Object [Input / Output] Stream sono le due classi che devi guardare.
Qualsiasi classe che desideri conservare nel file deve implementare l'interfaccia java.io.Serializable.
Potresti anche prendere in considerazione l'uso della codifica XML, che mi sembra avere una maggiore durata rispetto alla serializzazione. Utilizzare le classi java.beans.XMLEncoder / XMLDecoder
.
Non l'ho usato ma Google Code ha rilasciato di recente protobuf di recente.
Concordo con mjlee che Buffer di protocollo di Google è un modo migliore per archiviare oggetti rispetto al modo di serializzazione originale. Dai un'occhiata e lo adorerai.
Mi chiedo perché nessuno abbia menzionato JSON e, ad esempio, serializzatore Jackson JSON .