Qual è lo scopo della serializzazione in Java?


105

Ho letto un certo numero di articoli sulla serializzazione e su come sia così bella e fantastica, ma nessuno degli argomenti era abbastanza convincente. Mi chiedo se qualcuno possa davvero dirmi cosa possiamo davvero ottenere serializzando una classe?


10
Cosa "non convinceva" dei loro argomenti? E perché non hai accettato alcuna risposta alle tue domande?
Anon.

8
"Non era convinto" hanno risposto alle sue domande.
Anthony Forloney

5
Le risposte fornite erano, infatti, corrette. Se non funzionano per te, rispondi come commenti e prova a risolverlo invece di ignorarli e poi iniziare a infiammare gli altri quando ti fanno notare che non stai usando così bene.
Anon.

4
Anon sta contribuendo alla qualità del sito scoraggiando le domande duplicate. È sciocco vedere cinque domande separate che chiedono tutte la stessa cosa. Se non riesci a ottenere una risposta, beh a volte è proprio così. Se ottieni una risposta ma sembra che non funzioni, continua la discussione nei commenti. COSÌ non è una scatola magica che ti darà magicamente una risposta se fai la domanda giusta, o chiedi abbastanza volte, o attiri l'attenzione dell'esperto giusto.
Chris,

1
O: (Accetta la risposta) o (Pubblica un commento e / o modifica la domanda spiegando perché non è ciò di cui hai bisogno).
Anon.

Risposte:


182

Definiamo prima la serializzazione, quindi possiamo parlare del motivo per cui è così utile.

La serializzazione sta semplicemente trasformando un oggetto esistente in un array di byte. Questa matrice di byte rappresenta la classe dell'oggetto, la versione dell'oggetto e lo stato interno dell'oggetto. Questo array di byte può quindi essere utilizzato tra le JVM che eseguono lo stesso codice per trasmettere / leggere l'oggetto.

Perché dovremmo farlo?

Ci sono diversi motivi:

  • Comunicazione: se si hanno due macchine che eseguono lo stesso codice e hanno bisogno di comunicare, un modo semplice è che una macchina crei un oggetto con le informazioni che vorrebbe trasmettere e quindi serializzi quell'oggetto sull'altra macchina. Non è il metodo migliore per la comunicazione, ma porta a termine il lavoro.

  • Persistenza: se si desidera memorizzare lo stato di una particolare operazione in un database, è possibile serializzarla facilmente in un array di byte e archiviarla nel database per un successivo recupero.

  • Copia profonda: se hai bisogno di una replica esatta di un oggetto e non vuoi prenderti la briga di scrivere la tua classe clone () specializzata, semplicemente serializzando l'oggetto in un array di byte e quindi de-serializzandolo in un altro oggetto raggiunge questo obiettivo.

  • Memorizzazione nella cache: in realtà solo un'applicazione di quanto sopra, ma a volte un oggetto richiede 10 minuti per essere compilato, ma occorrerebbero solo 10 secondi per de-serializzare. Quindi, piuttosto che trattenere l'oggetto gigante in memoria, memorizzalo semplicemente nella cache in un file tramite serializzazione e leggilo in seguito quando è necessario.

  • Sincronizzazione Cross JVM: la serializzazione funziona su JVM differenti che possono essere in esecuzione su architetture differenti.


62
Cosa diavolo richiede 10 minuti per costruire?
oxbow_lakes

2
Il mio punto è (ovviamente) che l'I / O del file coinvolto nella serializzazione probabilmente sminuirà qualsiasi overhead di creazione di oggetti puri. Suppongo che tu stia parlando di qualcosa di molto costoso dal punto di vista computazionale come la modellazione scientifica, ma la serializzazione è un meccanismo molto scarso per la persistenza a causa della difficoltà di gestire le modifiche allo schema
oxbow_lakes

11
@oxbow_lakes Un esempio potrebbe essere se mantieni un indice di un particolare insieme di dati per una ricerca veloce. Un indice del genere può richiedere molto tempo per essere compilato, ma una volta creato può essere serializzato / de-serializzato in tempi relativamente brevi.
David,

Se la richiesta dell'app Web deve passare attraverso ogni router nel globo prima di raggiungere la destinazione, costruire l'oggetto, tornare indietro con l'oggetto utilizzando il percorso più lungo possibile, Sì, possono essere necessari 10 minuti.
Vaibs

@ Schmelter, dal momento che hai menzionato la serializzazione non il miglior metodo di comunicazione, qual è il metodo appropriato e migliore da implementare allora?
Ashfaque Rifaye

58

Durante l'esecuzione dell'applicazione, tutti i suoi oggetti vengono archiviati nella memoria (RAM). Quando esci, quella memoria viene recuperata dal sistema operativo e il tuo programma essenzialmente "dimentica" tutto ciò che è accaduto mentre era in esecuzione. La serializzazione risolve questo problema consentendo all'applicazione di salvare gli oggetti su disco in modo che possa leggerli al successivo avvio. Se la tua applicazione fornirà un modo per salvare / condividere uno stato precedente, avrai bisogno di una qualche forma di serializzazione.


2
Quindi, sembra che sia solo un modo migliore e più efficiente per scrivere dati su un file e rileggerlo quando necessario?
m_a_khan

1
Questa è l'unica vera spiegazione. Non riesco a pensare a nessun'altra applicazione del mondo reale della serializzazione +1
Emily

Breve e dolce. Spiegazione perfetta.
Yakhoob

21

Posso condividere la mia storia e spero che possa dare alcune idee sul perché la serializzazione è necessaria. Tuttavia, le risposte alla tua domanda sono già notevolmente dettagliate.

Avevo diversi progetti che dovevano caricare e leggere un mucchio di file di testo. I file contenevano parole di arresto, verbi biomedici, abbreviazioni biomediche, parole semanticamente collegate tra loro, ecc. I contenuti di questi file sono semplici: parole !

Ora, per ogni progetto, avevo bisogno di leggere le parole da ciascuno di questi file e inserirle in array diversi; poiché il contenuto del file non cambiava mai, è diventato un'attività comune, per quanto ridondante, dopo il primo progetto.

Quindi, quello che ho fatto è stato creare un oggetto per leggere ciascuno di questi file e per popolare singoli array (variabili di istanza degli oggetti). Quindi ho serializzato gli oggetti e quindi per i progetti successivi, li ho semplicemente deserializzati. Non ho dovuto leggere i file e popolare gli array ancora e ancora.


1
In tal caso, perché è necessario memorizzarli in un flusso di array di byte (utilizzando serializzare), potrebbe essere più semplice dell'utilizzo di un campo temporaneo?
kidnan1991

3

In sostanza :

La serializzazione è il processo di conversione di un insieme di istanze di oggetti che contengono riferimenti reciproci in un flusso lineare di byte, che può quindi essere inviato tramite un socket, archiviato in un file o semplicemente manipolato come flusso di dati

Vedi usi da Wiki :

La serializzazione ha una serie di vantaggi. Fornisce:

  1. un metodo per rendere persistenti gli oggetti che è più conveniente che scrivere le loro proprietà in un file di testo su disco e riassemblarli leggendoli nuovamente.
  2. un metodo per inviare chiamate a procedure remote, ad esempio, come in SOAP
  3. un metodo per la distribuzione di oggetti, specialmente in componenti software come COM, CORBA, ecc.
  4. un metodo per rilevare i cambiamenti nei dati variabili nel tempo.

1

Il più ovvio è che puoi trasmettere la classe serializzata su una rete e il destinatario può costruire un duplicato dell'istanza originale. Allo stesso modo, è possibile salvare una struttura serializzata in un file system.

Inoltre, nota che la serializzazione è ricorsiva, quindi puoi serializzare un'intera struttura di dati eterogenea in un sol colpo, se lo desideri.


0

Gli oggetti serializzati mantengono lo stato nello spazio, possono essere trasferiti sulla rete, file system, ecc ... e nel tempo possono sopravvivere alla JVM che li ha creati.

A volte questo è utile.


Ciò può essere ottenuto con un semplice file contenente anche del testo. È un po 'più facile rileggere un oggetto serializzato e poi leggere lo stato dell'oggetto scritto in un file di testo, corretto?
m_a_khan

@m_a_khan: Wow. Sì, può essere fatto con un semplice testo. Ma non appena gli oggetti diventano più complessi, o meglio le loro strutture (composizione, ereditarietà) diventano più complesse, diventerà una seccatura per (dis) schierarli manualmente. Immagina di avere elenchi, set e mappe come membri oggetto.
Dirk Schumacher

È facile trovare diversi schemi di serializzazione e in effetti ne esistono molti. Per ottime ragioni, nessuna di esse risulta nel caso generale, in un "testo semplice"
David Soroko

0

Uso oggetti serializzati per standardizzare gli argomenti che passo alle funzioni o ai costruttori di classi. Il passaggio di un bean serializzato è molto più semplice di un lungo elenco di argomenti. Il risultato è un codice più facile da leggere ed eseguire il debug.


1
A mio parere la searializzazione e l'utilizzo di un singolo oggetto di configurazione come parametro sono abbastanza ortogonali. Probabilmente questo non è un tipico caso d'uso.
Gábor Bakos

0

Per il semplice scopo di imparare (nota, ho detto apprendimento, non ho detto migliore, o anche buono, ma solo per capire le cose), potresti salvare i tuoi dati in un file di testo sul computer, quindi avere un programma che legge quelle informazioni e, in base al file, potresti fare in modo che il tuo programma risponda in modo diverso. Se fossi più avanzato, non dovrebbe essere necessariamente un file txt, ma qualcos'altro.

La serializzazione, d'altra parte, mette le cose direttamente nel linguaggio del computer. È come dire a un computer spagnolo qualcosa in spagnolo, piuttosto che dirgli qualcosa in francese, costringendolo a imparare il francese, quindi salvare le cose nel suo spagnolo nativo traducendo tutto. Non è la risposta più tecnologica, sto solo cercando di creare un esempio comprensibile in un formato di linguaggio comune.

Anche la serializzazione è più veloce, perché in Java gli oggetti vengono gestiti sull'heap e impiegano molto più tempo rispetto a se fossero rappresentati come primitive nello stack. Velocità, velocità, velocità. E meno elaborazione dei file dal punto di vista del programmatore.


Durante il tentativo di mettere le cose in un inglese semplice, non hai davvero spiegato la serializzazione in modo utile.
user3516726
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.