Serializzazione in Java: tutto ciò che devi sapere [2022]
Pubblicato: 2021-01-04Con il boom sempre crescente del settore IT, la nostra dipendenza da esso sembra crescere ogni giorno che passa. Questa crescita costante ha spinto molti professionisti che lavorano ad adottare i linguaggi di programmazione nel tentativo di rimanere rilevanti all'interno del settore. Sebbene l'industria utilizzi diverse lingue per servire i propri clienti, alcune lingue sono utilizzate più frequentemente di altre. Java è uno di questi linguaggi.
Indipendentemente dal fatto che tu sia un principiante o un veterano, una solida conoscenza di Java ti gioverà ad ogni svolta del tuo viaggio nel software. Come qualsiasi altro linguaggio di programmazione, anche Java racchiude un proprio programma completo. Bisogna praticare la lingua ogni giorno per afferrare tutti i vari concetti che punteggiano la lingua. Uno di questi concetti che aiuta molto gli utenti è la pratica della serializzazione in Java.
Sommario
introduzione
La serializzazione nel contesto di Java si riferisce al processo in cui un oggetto codice Java viene convertito sistematicamente in un flusso di byte. Questo viene fatto per consentire il trasferimento efficiente di detto codice oggetto da una macchina virtuale Java a un'altra. Successivamente, ciò consente la sua ricreazione con l'aiuto della deserializzazione. Usiamo la serializzazione per raggiungere più obiettivi. Diamo un'occhiata a quelli più popolari e rilevanti nella sezione seguente.
Perché viene utilizzata la serializzazione?
Il fenomeno della rappresentazione di un oggetto come una sequenza di byte ha la sua giusta quota di utilizzo all'interno del paradigma di programmazione. Quando il processo si estende anche alla rappresentazione dei dati dell'oggetto, l'utilità aumenta di molte volte. Di seguito sono elencati alcuni degli usi più comuni della serializzazione in Java.
Comunicazione
La serializzazione in Java consente una comunicazione efficace e tempestiva tra più sistemi informatici. Queste unità utilizzano la serializzazione e la trasmissione degli oggetti per facilitare la condivisione e la progettazione simultanee di vari oggetti. Di conseguenza, ciò si traduce anche in un'eventuale esecuzione senza intoppi. Nel caso di database voluminosi, la serializzazione consente un approccio estremamente semplificato alla gestione degli oggetti.
Memorizzazione nella cache
La memorizzazione nella cache, in un senso più ampio, si riferisce al metodo di memorizzazione delle informazioni per accedervi in un momento successivo, investendo su di esse un tempo minimo. La serializzazione in Java richiede la memorizzazione nella cache riducendo al minimo il tempo impiegato per la deserializzazione di un oggetto di grandi dimensioni. È risaputo che il tempo impiegato nella costruzione di un oggetto è molto maggiore rispetto al tempo impiegato per la deserializzazione. Pertanto, la serializzazione aiuta a ottimizzare questo consumo di tempo memorizzando nella cache gli oggetti relativamente più grandi nel mix.

Copia profonda
La copia profonda in Java si riferisce al processo di copia di oggetti da un albero in modo tale da non dipendere da nessuna delle sue versioni precedenti che potrebbero essere soggette a un certo grado di modifica. Questo processo di clonazione è molto più semplice adottando la serializzazione. Serializzando l'oggetto in una matrice di byte e quindi deserializzandolo successivamente, l'utente può ottenere una replica di detto oggetto.
Sincronizzazione tra macchine virtuali Java
Il vantaggio principale della pratica della serializzazione risiede nel fatto che consente all'utente di operare su diverse JVM. Una volta adottata la serializzazione, non importa se queste JVM funzionano sulla stessa o su architetture e sistemi operativi diversi o meno.
Persistenza
Applicando la serializzazione ad un oggetto, è possibile memorizzare direttamente lo stato dell'articolo senza alcun inconveniente. Inoltre, consente all'utente di salvare lo stato menzionato in un database che può essere recuperato in seguito in qualsiasi momento in futuro.
Leggi: Domande e risposte sull'intervista sulla serializzazione Java
Serializzazione di un oggetto: il processo coinvolto
Prima di procedere con la serializzazione di un oggetto, dobbiamo innanzitutto stabilire se è serializzabile o meno. Ora, come lo determiniamo? Un oggetto in Java è serializzabile se e solo se la sua classe o una qualsiasi delle sue classi padre consente l'implementazione dell'interfaccia java.io.Serializable. I criteri sono soddisfatti anche se queste classi implementano anche la sua sottointerfaccia, che è java.io.Externalizable.
Come discusso in precedenza, la sincronizzazione tra JVM è una delle applicazioni più potenti dell'utilizzo della serializzazione. Quando serializziamo un oggetto, convertiamo lo stato di questo oggetto in un flusso di byte. Di conseguenza, diventa possibile trasferire l'oggetto da una Java Virtual Machine a un'altra. Di conseguenza, anche questo flusso di byte può essere riconvertito nell'oggetto originale.
Questa conversione viene anche definita deserializzazione. È il processo inverso della serializzazione in cui il flusso di byte di un oggetto dal mittente che è stato precedentemente serializzato viene ricreato all'estremità ricevente.
Vantaggi della serializzazione in Java
Discutendo gli usi e le applicazioni della serializzazione nelle sezioni precedenti, abbiamo già fatto luce sui suoi vari meriti. È giunto il momento di fare un tuffo più profondo in loro.
- Uno dei vantaggi più significativi della serializzazione è il fatto che è una funzionalità incorporata. Per implementare o eseguire la serializzazione, non è necessario avvalersi dell'aiuto di software di terze parti.
- Anche per gli utenti che sono principianti e stanno appena imparando le loro corde, la serializzazione è un processo abbastanza facile da imparare e capire.
- Spesso gli sviluppatori provenienti da background di programmazione diversi ottengono un tocco di background quando devono affrontare le sfumature di un nuovo linguaggio. Tuttavia, nel caso della serializzazione, il processo è universale e quindi abbastanza familiare con tutti gli sviluppatori là fuori.
- Non solo è facile da usare e implementare, ma anche facile da personalizzare.
- Attualmente, esistono numerose tecnologie critiche che utilizzano la serializzazione nelle loro operazioni. Questo perché i flussi di dati serializzati supportano la crittografia, l'autenticazione, la compressione e l'elaborazione Java sicura.
Svantaggi della serializzazione in Java
Nessun linguaggio di programmazione è perfetto al cento per cento, e nemmeno loro possono affermare di esserlo. Di conseguenza, anche i concetti ei processi che li costituiscono non sono privi di una propria serie di difetti. Ecco alcuni degli svantaggi generali associati al processo di serializzazione.
- Alcuni processi di serializzazione richiedono anche l'applicazione della deserializzazione in tandem. Ora, lo svantaggio dell'applicazione della deserializzazione è che rende gli oggetti fragili. Di conseguenza, non c'è mai una certezza assoluta che detto oggetto verrà deserializzato in modo efficace.
- Quando viene invocato il processo di serializzazione, provoca la creazione di un gruppo di variabili transitorie. Queste variabili transitorie, una volta create, occupano spazio di memoria aggiuntivo. Tuttavia, molte di queste variabili transitorie non vengono inizializzate perché il costruttore non viene chiamato durante questi processi. Successivamente, finiscono per interessare una variazione allo Standard Java Flow.
- Nonostante tutte le ottimizzazioni relative al consumo di tempo, il processo di serializzazione è sempre più inefficiente per quanto riguarda l'utilizzo della memoria.
- Il processo di serializzazione non offre alcun meccanismo di controllo della transizione per ogni Standard Edition di Java. Di conseguenza, non è preferibile utilizzarlo in associazione con applicazioni che richiedono l'accesso parallelo senza il requisito di API di terze parti.
- Durante l'utilizzo della serializzazione, è spesso necessario scendere a compromessi per ottenere un controllo a grana fine per accedere agli oggetti.
La serializzazione vista attraverso una lente pratica
Finora, abbiamo discusso il processo di serializzazione come concetto teorico, compresi i suoi vari vantaggi e svantaggi. È giunto il momento di approfondire una discussione che ci permetta di visualizzare la serializzazione da un punto di vista pratico e la sua implementazione. Di seguito sono elencati alcuni casi che ci aiutano a comprendere la realizzazione pratica della serializzazione.

Da leggere: Proprietà e vantaggi di JavaBeans: come utilizzarlo?
Serializzazione ed ereditarietà
L'ereditarietà in Java è ampiamente definita come il fenomeno in cui una classe acquisisce o eredita i metodi ei campi di un'altra classe. La classe che eredita le proprietà viene definita sottoclasse e la classe le cui proprietà vengono ereditate viene chiamata superclasse. Il termine superclasse è anche usato in modo intercambiabile con la classe base e la classe genitore.
Il nostro primo caso riguarda la serializzazione nel contesto delle superclassi. In genere, se una superclasse è serializzabile, anche le sue sottoclassi possono essere considerate serializzabili per impostazione predefinita. Naturalmente, questo vale solo se la superclasse sta implementando l'interfaccia serializzabile. Tuttavia, ci sono anche alcuni casi in cui la sottoclasse può essere serializzata anche se la superclasse non implementa l'interfaccia Serializable.
Ciò avviene quando la sottoclasse riesce a implementare l'interfaccia Serializable nella sua unica capacità. Se la superclasse non riesce a implementare l'interfaccia serializzabile in qualsiasi circostanza, gli oggetti della sottoclasse possono essere serializzati manualmente quando la sottoclasse stessa implementa l'interfaccia serializzabile.
A volte, l'utente potrebbe imbattersi anche in una terza possibilità. Questa possibilità si presenta quando la superclasse è serializzabile, ma l'utente non ha bisogno di adottare il processo rispetto alla sottoclasse.
In situazioni come queste, ci sono modi in cui la serializzazione indesiderata della sottoclasse può essere prevenuta consapevolmente. Questo può essere fatto implementando i metodi writeObject() e readObject() nella sottoclasse. Tuttavia, l'attuazione di questi metodi da sola non è sufficiente. Oltre a scrivere questi metodi, l'utente deve anche assicurarsi che detti metodi non generino NotSerializableException dalla loro implementazione.
Serializzazione con l'aiuto di un membro statico
Quando il processo di serializzazione viene implementato, finisce per ignorare i membri del campo statico nel processo. Ciò è principalmente dovuto al fatto che la serializzazione come procedura riguarda in gran parte lo stato più recente dell'oggetto in questione. Di conseguenza, mentre i dati associati a un'istanza specifica di una classe vengono serializzati correttamente, il campo del membro statico in connessione con essa non lo è.
Serializzazione rispetto ai documenti XML
La serializzazione di oggetti Java in XML può essere ottenuta in diversi modi. Principalmente sono realizzati con l'aiuto di XMLEncoder e XMLDecoder. Lo scopo principale della serializzazione di oggetti Java in documenti XML consiste nel cercare di limitare i vari svantaggi che il processo di serializzazione comporta intrinsecamente.
Uno dei problemi più rilevanti nel processo di serializzazione è che la logica che salva e ripristina gli oggetti serializzati si basa solo sulla struttura interna delle classi costituenti. Non tiene conto di nessuna delle modifiche che potrebbero essere state causate a quelle classi nel tempo che intercorre tra il salvataggio dell'oggetto e il suo recupero. Di conseguenza, ciò si traduce nell'imminente fallimento del processo di deserializzazione.
Anche la serializzazione dà origine a problemi di versione. Ciò si verifica quando l'utente salva un oggetto utilizzando una versione della classe ma tenta di deserializzare la stessa classe utilizzando una versione diversa o nuova della classe. In questo caso, anche il processo di deserializzazione fallisce.
Pertanto, per evitare tutti questi problemi, alcuni utenti preferiscono serializzare oggetti in documenti XML piuttosto che adottare l'approccio convenzionale di serializzarli in formato binario. Inoltre, la serializzazione di oggetti Java in documenti XML assicura anche che l'oggetto diventi leggibile dall'uomo, facilitando così un livello superiore di praticità.
Checkout: Domande e risposte per l'intervista Java
Comprendere l'Interfaccia Esternalizzabile
L'interfaccia Externalizable in Java è abbastanza simile a quella dell'interfaccia di serializzazione. La differenza sta nella loro capacità di offrire una serializzazione personalizzata. L'interfaccia esternabilizzabile ti dà la possibilità di scegliere gli oggetti che desideri vengano archiviati nel flusso, mentre l'interfaccia di serializzazione non ti concede lo stesso privilegio.
Si può usufruire dell'interfaccia esternalizzabile in java.io. L'interfaccia esternabile fornisce all'utente anche due metodi. Il primo è il public void writeExternal(ObjectOutput out) che lancia IOException. L'altro è il vuoto pubblico readExternal(ObjectOutput in) che genera IOException.
Differenza tra serializzazione ed esternalizzazione
Oltre alle loro capacità di offrire una serializzazione personalizzata, alcune altre variabili chiave distinguono anche la serializzazione e l'esternalizzazione. Il segmento seguente li esamina più da vicino.
Implementazione
Una delle principali differenze tra le interfacce serializzabili ed esternalizzabili risiede nella loro implementazione. L'interfaccia esternalizzabile si aspetta che l'utente menzioni esplicitamente gli oggetti che desidera serializzare. Questo non è il caso quando si ha a che fare con l'interfaccia serializzabile. Nell'interfaccia serializzabile, tutti gli oggetti e le variabili vengono serializzati, senza alcuna differenziazione, durante il runtime.
Metodi
L'interfaccia Externalizable consiste principalmente in due metodi. Questi sono il metodo writeExternal() e il metodo readExternal(). L'interfaccia serializzabile, invece, non prevede alcun metodo.
Processi
Quando si esegue il processo di serializzazione nell'interfaccia esternabile, viene loro concesso il privilegio della serializzazione personalizzata. Mentre nell'interfaccia serializzabile ci si è soggetti al processo di serializzazione predefinito.
Compatibilità e controllo con le versioni precedenti
L'interfaccia Externalizable supporta la serializzazione senza riserve al controllo della versione in questione. L'unico problema con questo approccio è che l'utente deve essere lui stesso responsabile durante la serializzazione della superclasse. Al contrario, l'interfaccia di serializzazione richiede che la stessa versione delle JVM sia presente su entrambe le estremità. Tuttavia, consente una serializzazione predefinita di tutti gli oggetti e le classi, inclusa anche la superclasse.
Costruttore pubblico No-Arg
Durante la ricostruzione dell'oggetto serializzato, l'interfaccia di esternalizzazione richiede l'utilizzo del costruttore pubblico no-arg. Ciò è diverso nel caso dell'interfaccia di serializzazione che non richiede esplicitamente il costruttore no-arg, ma utilizza piuttosto la riflessione per ricostruire gli oggetti e le classi serializzati.
Serializzazione in Java: le controversie
Ci sono alcune controversie che si collegano al concetto di serializzazione in Java. Molti di loro si occupano in primo luogo della rimozione della serializzazione come procedura. È opinione diffusa che gli architetti di Oracle abbiano da tempo preso in considerazione la rimozione della serializzazione da Java poiché lo ritengono un terribile errore del 1997.
Secondo la loro ricerca, i difetti nella progettazione della procedura di serializzazione sono tali da rappresentare una minaccia per i dati stessi. In tal senso, Mark Reinhold nel 1997 ha attribuito quasi un terzo di tutte le vulnerabilità Java al processo di serializzazione, affermando anche che il quoziente potrebbe essere anche comodamente più di questo.

Quindi, c'è una buona possibilità che la serializzazione come costrutto venga del tutto rimossa o sostituita dagli annali di Java nei suoi imminenti aggiornamenti. Ciò potrebbe anche essere dovuto al fatto che la maggior parte degli esperti non considera la serializzazione un'opzione idealistica che i principianti in Java possono implementare nei loro progetti.
Leggi anche: Idee e argomenti del progetto Java
Ottieni il corso di sviluppo software dalle migliori università del mondo. Guadagna programmi Executive PG, programmi di certificazione avanzati o programmi di master per accelerare la tua carriera.
Conclusione
Una discussione e una deliberazione sulla serializzazione non possono essere concluse facendo luce su alcune delle sue migliori pratiche. Eccone alcuni che l'utente deve adottare per assicurarsi la migliore esperienza per se stesso.
- Per indicare i campi serializzabili, è necessario utilizzare il tag javadoc@serial.
- Per i file che rappresentano oggetti serializzati, è preferibile utilizzare l'estensione .ser.
- Normalmente il processo di assoggettamento di campi statici o temporanei alla serializzazione predefinita è disapprovato.
- A meno che non sia assolutamente obbligatorio, si deve, in ogni circostanza, cercare di evitare la serializzazione delle Classi Estendibili.
- Durante l'implementazione della serializzazione, è necessario assicurarsi di evitare che le classi interne vengano coinvolte nel processo di serializzazione.
Se sei interessato a saperne di più su Java, OOP e lo sviluppo di software full-stack, dai un'occhiata al programma Executive PG di upGrad e IIIT-B in Full-stack Software Development, progettato per i professionisti che lavorano e offre oltre 500 ore di formazione rigorosa, Oltre 9 progetti e incarichi, status di Alumni IIIT-B, progetti pratici pratici e assistenza sul lavoro con le migliori aziende
