2010-02-09 20 views
80

Ho letto parecchi articoli sulla serializzazione e su come sia bello e bello, ma nessuno degli argomenti è stato abbastanza convincente. Mi chiedo se qualcuno possa davvero dirmi cos'è che possiamo davvero realizzare serializzando una classe?Qual è lo scopo della serializzazione in Java?

+0

Intendi dire serializzare classi o oggetti? – Yoni

+10

Cosa "non era convincente" riguardo ai loro argomenti? E perché non hai accettato alcuna risposta alle tue domande? –

+7

Lui "non era convinto" hanno risposto alle sue domande. –

risposta

151

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 JVM che esegue lo stesso codice per trasmettere/leggere l'oggetto.

Perché dovremmo farlo?

Ci sono diverse ragioni:

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

  • Persistenza: se si desidera memorizzare lo stato di una particolare operazione in un database, è possibile serializzarlo facilmente su un array di byte e archiviarlo nel database per recuperarlo in un secondo momento.

  • copia completa: Se avete bisogno di un esatto replica di un oggetto , e non si vuole andare alla difficoltà di scrivere la propria classe clone specializzato(), è sufficiente la serializzazione l'oggetto da un array di byte, e quindi de-serializzarlo su un altro oggetto raggiunge questo obiettivo.

  • Caching: In realtà solo un'applicazione di cui sopra, ma a volte un oggetto richiede 10 minuti per la creazione, ma impiegherebbe solo 10 secondi per de-serializzare. Quindi, piuttosto che aggrapparsi all'oggetto gigante in memoria, basta nasconderlo in un file tramite serializzazione e leggerlo più tardi quando è necessario.

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

+46

Che diamine ci vogliono 10 minuti per costruire? –

+2

Il mio punto è (ovviamente) che il file I/O coinvolto nella serializzazione probabilmente metterà a repentaglio qualsiasi overhead di creazione di oggetti puri. Suppongo che tu stia parlando di qualcosa di molto costoso dal punto di vista computazionale come la modellizzazione scientifica, ma la serializzazione è un meccanismo molto povero di persistenza a causa della difficoltà di gestire le modifiche dello schema –

+11

@oxbow_lakes Un esempio potrebbe essere se si mantiene un indice di un particolare insieme di dati per una ricerca veloce. Un indice come quello può richiedere molto tempo per essere compilato, ma una volta creato può essere serializzato/de-serializzato relativamente rapidamente. – David

1

Il più ovvio è che è possibile 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 su un file system.

Inoltre, notare che la serializzazione è ricorsiva, quindi è possibile serializzare un'intera struttura di dati eterogenea in uno swell foop, se desiderato.

3

In essense:

serializzazione è il processo di conversione di un insieme di istanze di oggetti che contengono riferimenti reciproci in un flusso lineare di byte, che possono poi essere inviati attraverso un socket, memorizzati in un file, o semplicemente manipolata come un flusso di dati

See utilizza da Wiki:

La serializzazione presenta numerosi vantaggi. Esso prevede:.

  1. un metodo di oggetti persistenti che è più conveniente che scrivere le loro proprietà in un file di testo sul disco e li ri-assemblaggio da leggendo questo nel
  2. un metodo di emissione chiamate di procedura remota, esempio, come in SOAP
  3. un metodo per distribuzione degli oggetti, in particolare in software componentistica come COM, CORBA, ecc.
  4. un metodo per rilevare le variazioni di nei dati che variano nel tempo.
0

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

A volte questo è utile.

+0

Questo può essere ottenuto con un semplice file contenente anche del testo. È un po 'più facile leggere un oggetto serializzato, quindi leggere lo stato dell'oggetto scritto in un file di testo, correggere? –

+0

@m_a_khan: Wow. Sì, può essere fatto con un semplice testo. Ma non appena gli oggetti diventano più complessi, o meglio i loro structrues (composizione, ereditarietà) diventano più complessi, diventerà una seccatura doverli manualmente (smontarli). Immagina di avere liste, set e mappe come membri degli oggetti. –

+0

È facile creare diversi schemi di serializzazione e molti esistono. Per ottime ragioni, nessuno di questi risulta nel caso generale, in un "testo semplice" –

42

Mentre si esegue l'applicazione, tutti i relativi oggetti sono memorizzati nella memoria (RAM). Quando esci, quella memoria viene recuperata dal sistema operativo, e il tuo programma essenzialmente "dimentica" tutto ciò che è successo mentre era in esecuzione. La serializzazione risolve questo problema lasciando che l'applicazione salvi gli oggetti sul disco in modo che possa leggerli di nuovo al prossimo avvio. Se la tua applicazione fornirà un modo per salvare/condividere uno stato precedente, avrai bisogno di una qualche forma di serializzazione.

+1

Quindi, sembra che sia solo un modo migliore, più efficiente di scrivere dati in un file e di leggerlo quando necessario? –

+1

Bella spiegazione, grazie! –

+1

Questa è l'unica spiegazione REALE. Non riesco a pensare ad alcuna altra applicazione del mondo reale di serializzazione +1 – Emily

16

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

Ho avuto diversi progetti che hanno bisogno di caricare e leggere un mucchio di file di testo. I file contenevano parole di arresto, verbi biomedici, abbreviazioni biomediche, parole semanticamente connesse tra loro, ecc. Il contenuto di questi file è semplice: parole!

Ora, per ogni progetto, avevo bisogno di leggere le parole da ciascuno di questi file e metterli in diversi array; dato che il contenuto del file non è mai cambiato, è diventato un compito comune, comunque ridondante, dopo il primo progetto.

Quindi, quello che ho fatto è che ho creato un oggetto per leggere ciascuno di questi file e per compilare i singoli array (variabili di istanza degli oggetti). Poi ho serializzato gli oggetti e poi per i progetti successivi, li ho semplicemente deserializzati. Non ho dovuto leggere i file e popolare gli array più e più volte.

1

Uso gli oggetti serializzati per standardizzare gli argomenti che passo alle funzioni o ai costruttori di classi. Passare un bean serializzato è molto più pulito di un lungo elenco di argomenti. Il risultato è un codice che è più facile da leggere e correggere.

+0

Secondo me la searializzazione e l'uso di un singolo oggetto di configurazione come parametro sono abbastanza ortogonali. Probabilmente questo non è un tipico caso d'uso. –

0

Per il semplice scopo dell'apprendimento (avviso, ho detto di apprendimento, non ho detto il meglio, o anche buono, ma solo per motivi di comprensione), è possibile salvare i dati in un file di testo sul computer, quindi disporre di un programma che legge tali informazioni e, in base al file, il proprio programma potrebbe rispondere in modo diverso. Se fossi più avanzato, non dovrebbe necessariamente essere un file txt, ma qualcos'altro.

La serializzazione, d'altra parte, mette le cose direttamente nel linguaggio del computer. È come se tu dicessi 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ù tech-intensive, sto solo cercando di creare un esempio comprensibile in un formato di linguaggio comune.

La serializzazione è anche più veloce, perché in Java gli oggetti vengono gestiti nell'heap e richiedono molto più tempo rispetto a quando erano rappresentati come primitive nello stack. Velocità, velocità, velocità. E meno elaborazione dei file dal punto di vista del programmatore.

+0

Durante il tentativo di mettere le cose in chiaro inglese, non hai veramente spiegato la serializzazione in alcun modo utile. – user3516726

1

La serializzazione viene utilizzata nei casi in cui si desidera salvare uno stato dell'oggetto e convertire tale oggetto in flusso di byte, gli oggetti devono essere serilazed. Durante l'esecuzione dell'applicazione, tutti i relativi oggetti vengono archiviati in memoria (memoria heap). Quando esci, quella memoria viene recuperata dal sistema operativo, e il tuo programma essenzialmente "dimentica" tutto ciò che è successo mentre era in esecuzione. In questi tipi di situazione, è possibile utilizzare la serializzazione lasciando che l'applicazione salvi gli oggetti sul disco in modo che possa leggerli al prossimo avvio. Se la tua applicazione fornirà un modo per salvare/condividere uno stato precedente, avrai bisogno di una qualche forma di serializzazione.

Ogni volta che un oggetto deve inviare sulla rete, tali oggetti devono essere serializzati. Ad esempio, se si hanno due macchine che eseguono lo stesso codice e devono comunicare, un modo semplice è che una macchina costruisca un oggetto con le informazioni che desidera trasmettere e quindi serializzi quell'oggetto sull'altra macchina . Non è il metodo migliore per la comunicazione, ma fa il lavoro con la serializzazione.

Cross JVM Synchronization - La serializzazione funziona tra diverse Java Virtual Machine JVM che possono essere in esecuzione su architetture diverse.

Problemi correlati