"Ricorderai che oggi abbiamo esaminato il salvataggio di oggetti e la loro lettura da un file?"

"Sì, abbiamo appena salvato in un flusso di output, una lettura da un flusso di input."

"Ben fatto, Amigo. È bello sapere che stai notando questi dettagli. Saresti in grado di completare il codice in modo che salvi e legga da un file?"

"Completare cosa?! Dichiarare un FileInputStream e un FileOutputStream e passarli ai metodi di salvataggio e caricamento. Non c'è niente da confondere qui. Super semplice."

"Sono felice per te. Ora per un nuovo argomento: la serializzazione ."

La serializzazione è quasi la stessa di quella che abbiamo appena fatto, ma molto più interessante e integrata direttamente nella macchina Java. La macchina Java può memorizzare e caricare i suoi oggetti. Non ha nemmeno bisogno dei metodi di salvataggio e caricamento per farlo: tutti gli oggetti sono memorizzati all'interno della macchina Java e ha pieno accesso ad essi."

Prendiamo semplicemente l'oggetto e lo salviamo in un flusso e leggiamo da un flusso:

Codice
public static void main(String[] args) throws Exception
{
 Cat cat = new Cat();

 //Save a cat to file
 FileOutputStream fileOutput = new FileOutputStream("cat.dat");
 ObjectOutputStream outputStream = new ObjectOutputStream(fileOutput);
 outputStream.writeObject(cat);
 fileOutput.close();
 outputStream.close();

 //Load a cat from file
 FileInputStream fiStream = new FileInputStream("cat.dat");
 ObjectInputStream objectStream = new ObjectInputStream(fiStream);
 Object object = objectStream.readObject();
 fiStream.close();
 objectStream.close();

 Cat newCat = (Cat)object;
}

"Questo è tutto?"

"Esattamente. Esiste un meccanismo di serializzazione molto ampio e complesso che ci consente di salvare in un flusso e leggere da un flusso quasi tutti i tipi di dati."

"Quasi qualsiasi. Quindi nessun tipo di dato?"

"Sì, il fatto è che non tutti gli oggetti hanno la capacità intrinseca di essere salvati . Alcuni oggetti non memorizzano tutti i loro dati internamente. Invece, si limitano a fare riferimento ad altri oggetti e/o fonti di dati. Ad esempio, la console (System. in), un flusso di input (InputStream) e altre cose."

Ecco perché i creatori di Java hanno inventato lo speciale marcatore di interfaccia Serializable . Si chiama marker , perché non contiene dati e metodi. Viene utilizzato solo per "taggare" o "contrassegnare" le classi. Se riteniamo che la nostra classe memorizzi internamente tutti i suoi dati, possiamo contrassegnarla con implements Serializable .

Ecco un esempio «gatto» con supporto per la serializzazione:

Codice
class Cat implements Serializable
{
 public String name;
 public int age;
 public int weight;
}

Quando proviamo a serializzare (salvare) un oggetto, la macchina Java verifica se supporta la serializzazione: implementa l'interfaccia Serializable? In caso affermativo, salva l'oggetto. In caso contrario, genera un'eccezione per indicare che la serializzazione è impossibile.
Qui devi capire che un oggetto serializzabile deve essere costituito solo da oggetti serializzabili.

"Beh, questo ha senso. Non puoi salvare il tutto senza salvarne le parti."

"Esattamente."

"E che dire di int, stringhe e arrayList?"

"Tutti supportano la serializzazione. I creatori di Java hanno prestato particolare attenzione per assicurarsi che ciò accadesse. Non dovrebbero esserci problemi qui."

Inoltre, il tipo di un oggetto viene salvato quando l'oggetto viene serializzato. Ora puoi salvare un riferimento a un oggetto Cat in una variabile Object. Tutto verrà serializzato e deserializzato bene.

"Deserializzare?"

" La deserializzazione è il processo di inversione della serializzazione: lettura e ricostruzione di un oggetto da un flusso/file."

"Ah, niente più domande allora."