GeeksforGeeks (Italiano)

La serializzazione è un meccanismo di conversione dello stato di un oggetto in un flusso di byte. La deserializzazione è il processo inverso in cui il flusso di byte viene utilizzato per ricreare l’oggetto Java effettivo in memoria. Questo meccanismo viene utilizzato per mantenere l’oggetto.

Il flusso di byte creato è indipendente dalla piattaforma. Quindi, l’oggetto serializzato su una piattaforma può essere deserializzato su una piattaforma diversa.,

Per rendere serializzabile un oggetto Java implementiamo l’interfaccia java.io.Serializzabile.
La classe ObjectOutputStream contiene il metodo writeObject() per serializzare un oggetto.

public final void writeObject(Object obj) throws IOException

La classe ObjectInputStream contiene il metodo readObject() per deserializzare un oggetto.

public final Object readObject() throws IOException, ClassNotFoundException

Vantaggi della serializzazione
1. Per salvare / mantenere lo stato di un oggetto.
2. Per viaggiare un oggetto attraverso una rete.

Solo gli oggetti di quelle classi possono essere serializzati che implementano l’interfaccia java.io.Serializable.,
Serializable è un’interfaccia marker (non ha alcun membro e metodo di dati). Viene utilizzato per” contrassegnare ” le classi java in modo che gli oggetti di queste classi possano ottenere determinate capacità. Altri esempi di interfacce marker sono: – Cloneable e Remote.

Punti da ricordare
1. Se una classe padre ha implementato un’interfaccia serializzabile, la classe figlio non ha bisogno di implementarla, ma viceversa non è vero.
2. Solo i membri di dati non statici vengono salvati tramite il processo di serializzazione.
3. I membri di dati statici e i membri di dati transitori non vengono salvati tramite il processo di serializzazione.,Quindi, se non si desidera salvare il valore di un membro di dati non statico, renderlo transitorio.
4. Costruttore di oggetto non viene mai chiamato quando un oggetto è deserializzato.
5. Gli oggetti associati devono implementare un’interfaccia serializzabile.
Esempio:

class A implements Serializable{// B also implements Serializable// interface.B ob=new B(); }

SerialVersionUID
Il runtime di serializzazione associa un numero di versione a ciascuna classe Serializable chiamata SerialVersionUID, che viene utilizzato durante la deserializzazione per verificare che mittente e destinatario di un oggetto serializzato abbiano caricato classi per quell’oggetto compatibili rispetto alla serializzazione., Se il destinatario ha caricato una classe per l’oggetto con UID diverso da quello della classe del mittente corrispondente, la deserializzazione genererà un’eccezione InvalidClassException. Una classe serializzabile può dichiarare il proprio UID esplicitamente dichiarando un nome di campo.
Deve essere statico, finale e di tipo long.
i.,e-ANY-ACCESS-MODIFIER static final long serialVersionUID=42L;

Se una classe serializable non dichiara esplicitamente un serialVersionUID, il runtime di serializzazione ne calcolerà uno predefinito per quella classe in base a vari aspetti della classe, come descritto nella specifica di serializzazione degli oggetti Java. Tuttavia, si raccomanda vivamente che tutte le classi serializable dichiarino esplicitamente il valore serialVersionUID, poiché il suo calcolo è altamente sensibile ai dettagli della classe che possono variare a seconda delle implementazioni del compilatore, qualsiasi modifica nella classe o utilizzo di id diversi può influenzare i dati serializzati.,

Si consiglia inoltre di utilizzare modificatore privato per UID poiché non è utile come membro ereditato.

serialver
Il serialver è uno strumento fornito con JDK. Viene utilizzato per ottenere il numero serialVersionUID per le classi Java.,
È possibile eseguire il seguente comando per ottenere serialVersionUID

serialver

Esempio 1:



Uscita :

Object has been serializedObject has been deserialized a = 1b = geeksforgeeks

Esempio 2:



Uscita:

Object has been serializedData before Deserialization.name = abage = 20a = 2b = 1000Object has been deserializedData after Deserialization.name = abage = 20a = 0b = 2000

Descrizione per l’Output:
Avete visto durante la deserializzazione oggetto i valori di a e b è cambiato. Il motivo per cui a era contrassegnato come transitorio e b era statico.,
In caso di variabili transitorie:- Una variabile definita con la parola chiave transient non viene serializzata durante il processo di serializzazione.Questa variabile verrà inizializzata con il valore predefinito durante la deserializzazione. (ad esempio: per gli oggetti è null, per int è 0).
In caso di variabili statiche:- Una variabile definita con la parola chiave static non viene serializzata durante il processo di serializzazione.Questa variabile verrà caricata con il valore corrente definito nella classe durante la deserializzazione.

Questo articolo è contribuito da Mehak Narang e Shubham Juneja., Se ti piace GeeksforGeeks e vorrebbe contribuire, si può anche scrivere un articolo utilizzando contribute.geeksforgeeks.org o posta il tuo articolo a [email protected]. Vedere il tuo articolo che appare sulla pagina principale GeeksforGeeks e aiutare altri Geek.
Si prega di scrivere commenti se trovate qualcosa di sbagliato, o se si desidera condividere ulteriori informazioni sull’argomento discusso sopra.

Lettore di attenzione! Non smettere di imparare ora., Entra in possesso di tutti gli importanti concetti di Java Foundation e Collections con i fondamenti del corso Java e Java Collections ad un prezzo adatto agli studenti e diventa pronto per l’industria.

Tag articolo:

Java
Pratica tag:

Lascia un commento

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