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

È stato utile?

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:

  1. Come farai con le modifiche dello schema (ovvero cambiando i dati di cui sono composte le tue classi - ad esempio aggiungendo un nuovo campo)
  2. 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
  3. 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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top