Interfaccia serializzabile in Java con esempi

Pubblicato: 2021-11-29

Java offre diversi pacchetti, di cui uno è l'interfaccia Serializable. È presente all'interno del pacchetto Java java.io ed è un tipo di interfaccia marker. Quando definita come interfaccia marker, non sono presenti metodi o campi nell'interfaccia. Quindi, ogni volta che una classe implementa l'interfaccia, l'interfaccia non è richiesta per implementare alcun metodo. Le classi implementano l'interfaccia se una classe desidera che le proprie istanze vengano serializzate o deserializzate.

Il meccanismo di serializzazione viene utilizzato per la conversione di uno stato oggetto in un flusso di byte. Questo meccanismo viene eseguito utilizzando ObjectOutputStream. Il processo di deserializzazione è esattamente l'opposto del processo di serializzazione. In questo caso, il flusso di byte viene riconvertito nell'oggetto di Java. ObjectInputStream viene utilizzato per la deserializzazione.

Sommario

Serializzazione

La conversione dello stato di qualsiasi oggetto in un flusso di byte è nota come serializzazione. E l'opposto della serializzazione è la deserializzazione. Un oggetto di Java può essere convertito in un flusso di byte statici. Questo flusso statico può quindi essere salvato su un database o può anche essere trasferito su una rete diversa. Il processo di serializzazione dipende dall'istanza. Ciò significa che la serializzazione degli oggetti può essere eseguita su una piattaforma e quindi la deserializzazione degli oggetti può essere eseguita su un'altra piattaforma. Per il processo di serializzazione viene implementato un particolare tipo di interfaccia marker, "Serializzabile". Quindi, le classi idonee per la serializzazione, cioè la classe serializzabile in Java , dovrebbero implementare l'interfaccia del marcatore.

Questo meccanismo di scrittura di uno stato oggetto in un flusso di byte è noto come serializzazione. Il meccanismo è utilizzato principalmente nelle tecnologie JMS, EJB, JPA, RMI e Hibernate.

ObjectInputStream e ObjectOutputStream sono le forme di classi di alto livello che estendono java.io.InputStream e java.io.OutputStream. I tipi primitivi e gli oggetti grafici possono essere scritti in OutputStream da ObjectOutputStream in un byte

flusso. Il flusso risultante dalla conversione può essere letto tramite ObjectInputStream. Quindi, per la serializzazione, il metodo writeObject() viene chiamato da ObjectOutputStream e per la deserializzazione, il metodo readObject() viene chiamato dalla classe ObjectInputStream.

Il metodo più importante in ObjectOutputStream è:

La riga di codice sopra è presa da https://www.baeldung.com/java-serialization.

Nella riga di codice sopra, viene preso un oggetto che è serializzabile e quindi viene convertito in un flusso o flusso di byte.

Nel caso di ObjectInputStream, il metodo più critico è:

La riga di codice sopra è presa da https://www.baeldung.com/java-serialization.

La riga di codice sopra può leggere la sequenza di byte e convertire questo flusso di byte in un oggetto di Java. L'oggetto originale può essere restituito attraverso questo.

Un'illustrazione del processo di serializzazione può essere descritta di seguito:

Per la serializzazione viene considerata una classe "Persona". I campi statici non sono serializzati e appartengono ad alcune classi. I campi della classe possono essere ignorati utilizzando la parola chiave “transient” nel processo di serializzazione.

Fonte

L'oggetto del tipo persona può essere salvato in un file locale, quindi il valore viene riletto. Il codice mostrato di seguito può essere utilizzato per questo scopo.

ObjectOutputStream è stato utilizzato per salvare lo stato dell'oggetto in un file tramite FileOutputStream. In questo esempio, è stato creato un file denominato “yourfile.txt” nella directory del progetto. Attraverso l'uso di FileInputStream, il file creato viene caricato. Questo flusso viene quindi prelevato da ObjectInputStream e viene convertito in un nuovo oggetto con il nome p2. Lo stato dell'oggetto caricato viene infine testato e viene confrontato con lo stato dell'oggetto originale. L'oggetto che viene caricato deve essere trasmesso in modo esplicito alla persona tipica.

Avvertenze nella serializzazione Java

1. Eredità e composizione

Ogni volta che un utente implementa l'interfaccia java.io.Serializable, tutte le sottoclassi di classe che implementano l'interfaccia diventano serializzabili. Inoltre, se un oggetto contiene un riferimento a un oggetto diverso, gli oggetti a cui si fa riferimento per implementare l'interfaccia sono serializzabili separatamente; se questi oggetti non implementano l'interfaccia, verrà eliminata un'eccezione. L'eccezione generata sarà NotSerializableException. Inoltre, se si supponga che una matrice di oggetti sia archiviata in un oggetto serializzabile, tutti gli oggetti della matrice dovrebbero essere serializzati. Se non si verifica alcuna serializzazione degli oggetti, verrà generata l'eccezione "NotSerializableException".

2. UID versione seriale

Per ogni classe che implementa l'interfaccia Serializable, a ciascuna delle classi è associato un numero. Il numero è associato alla Java Virtual Machine. Questo viene fatto principalmente per verificare che gli oggetti caricati e salvati abbiano gli attributi esatti. Solo se gli attributi sono gli stessi, gli oggetti sarebbero compatibili al momento della serializzazione. Gli IDE generano questi numeri automaticamente e si basano principalmente sui nomi della classe, sui suoi attributi e sui modificatori di accesso ad essa associati. Verrà generata un'eccezione, "InvalidClassException", se dalle modifiche risulta un numero diverso.

Se un serialVersionUID non è dichiarato da una classe serializzabile, la JVM lo genererà automaticamente durante il runtime. Sebbene ci sarà la generazione automatica del numero, è comunque consigliabile che le classi dichiarino un serialVersionUID. Ciò è dovuto al fatto che serialVersionUID, che verrà generato automaticamente, dipenderà dal compilatore e talvolta potrebbe generare InvalidClassExceptions imprevisto.

3. Serializzazione personalizzata

In Java è stato impostato un modo predefinito per serializzare gli oggetti. Java può ignorare questo comportamento predefinito. C'è un modo per la serializzazione personalizzata. È particolarmente utile nei casi in cui si tenta di serializzare l'oggetto con attributi non serializzabili. La serializzazione per tali oggetti può essere eseguita tramite due metodi all'interno di una classe che l'utente desidera serializzare. Questi due metodi sono:

I due metodi precedenti possono essere utilizzati per serializzare gli attributi in qualsiasi modulo che può essere serializzato, che in precedenza non era serializzabile.

Vantaggi della serializzazione in Java

Uno dei vantaggi della serializzazione in Java è che lo stato di un oggetto può essere percorso su una rete.

L'interfaccia Java java.io.Serializable

java.io.Serializable è un'interfaccia marker che significa che non ci sono metodi e oggetti all'interno dell'interfaccia. La funzione principale dell'interfaccia del marcatore è contrassegnare il

classi di Java per dare una capacità particolare a tutti gli oggetti delle classi. Esempi di interfacce marker sono Remote e Cloneable.

L'interfaccia deve essere implementata da qualsiasi classe che utilizzi l'interfaccia per serializzare i suoi oggetti. Per impostazione predefinita, le classi come le classi wrapper e la classe String implementano l'interfaccia java.io.Serializable.

Di seguito viene mostrato un esempio serializzabile java.

Nel codice sopra si può osservare che la classe Student implementa l'interfaccia Serializable. Pertanto, una volta che la classe implementa l'interfaccia Serializable, gli oggetti all'interno della classe possono essere convertiti in byte di stream.

  • Classe ObjectOutputStream

Questa classe viene utilizzata per scrivere i tipi primitivi di dati e gli oggetti Java in OutputStream. L'oggetto che supporta l'interfaccia java.io.Serializable può essere utilizzato per scrivere nei flussi.

  • Classe ObjectInputStream

Tutti i dati primitivi scritti tramite ObjectOutputStream vengono deserializzati tramite ObjectInputStream.

Di seguito è mostrato un esempio di interfaccia serializzabile in Java.

In questo esempio, la classe Student verrà serializzata. Il metodo writeObject() della classe ObjectOutputStream, fornisce tutte le funzionalità per serializzare gli oggetti. Lo stato dell'oggetto viene salvato in un file con il nome f.txt.

Conclusioni

L'articolo ha discusso il concetto di serializzazione in Java. Elencava le interfacce e gli altri metodi importanti richiesti per serializzare gli oggetti di una classe. Il processo di serializzazione è sempre associato ad un id o ad un numero con ogni classe serializzabile. Questo numero è denominato SerialVersionUID. L'uso principale di SerialVersionUID è verificare il mittente e il destinatario per l'oggetto da serializzare. Questo perché sia ​​il mittente che il destinatario dovrebbero essere gli stessi.

È una caratteristica importante del linguaggio di programmazione Java. Se vuoi saperne di più su funzionalità e concetti così importanti in Java e padroneggiare le tue abilità nel linguaggio di programmazione, puoi controllare i corsi di ingegneria del software offerti da upGrad. Se sei un professionista, il corso è più adatto a te. Per qualsiasi forma di richiesta, è possibile contattare il nostro team di assistenza. Puoi anche navigare nel nostro sito Web per il corso specifico e ottenere informazioni dettagliate.

Che cos'è l'interfaccia serializzabile in Java?

L'interfaccia serializzabile è un'interfaccia marker. L'interfaccia del marker fornisce un suggerimento al runtime Java che la classe di implementazione consente di serializzare se stessa. Il runtime trarrà vantaggio da questa interfaccia per serializzare l'oggetto. L'interfaccia serializzabile in java è un'interfaccia speciale che deve essere implementata dalle classi di dati in java. Quando una classe implementa questa interfaccia, può essere mantenuta in un database. Questa interfaccia è dichiarata nel pacchetto java.io. L'interfaccia serializzabile ha due metodi, readResolve() e writeReplace() , che vengono utilizzati per leggere e scrivere oggetti nel database.

Cosa succede se implementiamo l'interfaccia serializzabile in Java?

L'implementazione dell'interfaccia serializzabile in Java significa avere un oggetto che può essere serializzato e deserializzato in qualsiasi sistema dotato di interfaccia serializzabile. L'implementazione di tale interfaccia sarebbe efficace quando la classe viene serializzata esternamente da librerie di terze parti (JSON, XML, ecc.) o da protocolli di rete. Quando una variabile viene dichiarata serializzabile, ogni istanza della variabile verrà serializzata e deserializzato se viene passata come parametro a un metodo o quando viene restituita da un metodo. La serializzazione viene eseguita a livello di codice in modo che lo stato di un oggetto possa essere conservato per dopo, quando deve essere deserializzato e presentato all'utente dell'oggetto.

Possiamo trasferire un oggetto serializzato tramite rete?

Un oggetto serializzato è un oggetto che contiene un flusso di byte. Il costruttore dell'oggetto oi metodi writeObject() / readObject() vengono utilizzati per inserire il flusso di byte nell'oggetto. I dati memorizzati possono essere di testo, audio, video o qualsiasi dato di applicazione personalizzato. I dati per questi oggetti possono essere archiviati in un file o su un server remoto. Per trasferire oggetti serializzati tramite rete è necessario utilizzare il protocollo RMI (Remote Method Invocation). RMI è un buon protocollo per la creazione di applicazioni distribuite. Consente al client di comunicare con i metodi sugli oggetti in un'applicazione Java in esecuzione su un server. Il protocollo RMI è un meccanismo di Remote Procedure Call (RPC).