Introduzione

la Serializzazione è la conversione di stato di un oggetto in un flusso di byte; la deserializzazione fa il contrario. Detto diversamente, la serializzazione è la conversione di un oggetto Java in un flusso statico (sequenza) di byte che possono quindi essere salvati in un database o trasferiti su una rete.

Serializzazione e deserializzazione

Il processo di serializzazione è indipendente dall’istanza, ovvero, gli oggetti possono essere serializzati su una piattaforma e deserializzati su un’altra. Le classi che sono idonee per la serializzazione devono implementare una speciale interfaccia di marker Serializzabile.

Sia ObjectInputStream che ObjectOutputStream sono classi di alto livello che estendono rispettivamente java.io.InputStream e java.io.OutputStream. ObjectOutputStream può scrivere tipi primitivi e grafici di oggetti in un OutputStream come un flusso di byte. Questi flussi possono essere successivamente letti utilizzando ObjectInputStream.,

Il metodo più importante in ObjectOutputStream è:

public final void writeObject(Object o) throws IOException;

Che prende un oggetto serializzabile e lo converte in una sequenza (stream) di byte. Allo stesso modo, il metodo più importante in ObjectInputStream è:

public final Object readObject() throws IOException, ClassNotFoundException;

Che può leggere un flusso di byte e convertirlo in un oggetto Java. Questo può quindi essere riportato all’oggetto originale.

Illustriamo la serializzazione con una classe Person. Si noti che i campi statici appartengono a una classe (al contrario di un oggetto) e non sono serializzati., Inoltre, si noti che è possibile utilizzare la parola chiave transitoria di ignorare i campi della classe durante la serializzazione:

public class Person implements Serializable { private static final long serialVersionUID = 1L; static String country = "ITALY"; private int age; private String name; transient int height; // getters and setters}

Il test di seguito è illustrato un esempio di salvataggio di un oggetto di tipo Persona in un file locale, quindi leggere questo valore:

Abbiamo usato ObjectOutputStream per salvare lo stato di questo oggetto in un file utilizzando FileOutputStream. Il file ” yourfile.txt ” viene creato nella directory del progetto. Questo file viene quindi caricato utilizzando FileInputStream. ObjectInputStream preleva questo flusso e lo converte in un nuovo oggetto chiamato p2.,

Infine, testiamo lo stato dell’oggetto caricato e corrisponde allo stato dell’oggetto originale.

Si noti che l’oggetto caricato deve essere esplicitamente trasmesso a un tipo di persona.

Avvertenze sulla serializzazione Java

Ci sono alcune avvertenze che riguardano la serializzazione in Java.

3.1. Ereditarietà e composizione

Quando una classe implementa l’interfaccia java.io.Serializable, tutte le sue sottoclassi sono serializable pure., Al contrario, quando un oggetto ha un riferimento a un altro oggetto, questi oggetti devono implementare l’interfaccia Serializable separatamente, o altrimenti un NotSerializableException verrà generata:

public class Person implements Serializable { private int age; private String name; private Address country; // must be serializable too}

Se uno dei campi di un oggetto serializzabile consiste di un array di oggetti, tutti questi oggetti devono essere serializzabili così, o altrimenti un NotSerializableException verrà generata.

3.2. Versione seriale UID

La JVM associa un numero di versione (lungo) a ciascuna classe serializzabile., Viene utilizzato per verificare che gli oggetti salvati e caricati abbiano gli stessi attributi e quindi siano compatibili con la serializzazione.

Questo numero può essere generato automaticamente dalla maggior parte degli IDE e si basa sul nome della classe, sui suoi attributi e sui modificatori di accesso associati. Qualsiasi modifica comporta un numero diverso e può causare una InvalidClassException.

Se una classe serializable non dichiara un serialVersionUID, la JVM ne genererà uno automaticamente in fase di esecuzione., Tuttavia, è altamente raccomandato che ogni classe dichiari il suo serialVersionUID in quanto quello generato dipende dal compilatore e quindi può causare InvalidClassExceptions imprevisti.

3.3. Serializzazione personalizzata in Java

Java specifica un modo predefinito in cui gli oggetti possono essere serializzati. Le classi Java possono ignorare questo comportamento predefinito. La serializzazione personalizzata può essere particolarmente utile quando si tenta di serializzare un oggetto con alcuni attributi non serializzabili., Questo può essere fatto fornendo due metodi all’interno della classe che si desidera serializzare:

private void writeObject(ObjectOutputStream out) throws IOException;

e

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;

Con questi metodi, si può serializzare quelli unserializable attributi in altre forme che possono essere serializzati:

public class Address { private int houseNumber; // setters and getters}

I seguenti unità di test di test di questa serializzazione personalizzata:

In questo codice, vediamo come salvare alcuni unserializable di attributi per la serializzazione di Indirizzo con la serializzazione personalizzata. Si noti che dobbiamo contrassegnare gli attributi unserializable come transitori per evitare NotSerializableException.,

Conclusione

In questo breve tutorial, abbiamo esaminato la serializzazione Java, discusso cose importanti da tenere a mente e hanno mostrato come fare serializzazione personalizzata.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *