# Serializzazione

In informatica, la serializzazione è un processo per salvare un oggetto in un supporto di memorizzazione lineare (ad esempio, un file o un'area di memoria), o per trasmetterlo su una connessione di rete. La serializzazione può essere in forma binaria o può utilizzare codifiche testuali (ad esempio il formato XML) direttamente leggibili dagli esseri umani. Lo scopo della serializzazione è di trasmettere l'intero stato dell'oggetto in modo che esso possa essere successivamente ricreato nello stesso identico stato dal processo inverso, chiamato deserializzazione.

## Usi della serializzazione

La serializzazione ha numerosi vantaggi, e fornisce:
* un metodo per usare in modo migliore gli oggetti persistenti
* un metodo per supportare le chiamate di procedura remota (rpc)
* un metodo per distribuire gli oggetti, come ad esempio in software quali CORBA
Alcune di queste caratteristiche necessitano l'indipendenza dall'architettura per essere utilizzabili. Ad esempio, per un uso ottimale della distribuzione, un computer basato su un'architettura hardware differente deve essere in grado di ricostruire un flusso di dati serializzati a prescindere dall'ordinamento dei byte. Questo significa che il metodo più semplice e rapido di copiare direttamente la configurazione della memoria delle strutture dati non può funzionare adeguatamente per tutte le architetture. Serializzare le strutture dati in un formato indipendente dall'architettura significa non avere problemi relativi all'ordinamento dei byte, alla configurazione della memoria, o più semplicemente dovuti ai differenti modi di rappresentare le strutture dati nei diversi linguaggi di programmazione.
Una caratteristica presente in molti schemi di serializzazione è quella che per estrarre una parte delle strutture dati serializzate è necessario che venga letto e ricostruito l'intero oggetto, poiché la codifica dei dati è seriale.
Un altro problema è rappresentato dai puntatori: anche su una singola macchina, questi sono entità troppo labili per essere salvati, perché l'oggetto al quale puntano può essere caricato, durante la deserializzazione, in un'area di memoria differente. Il processo che permette di risolvere questo problema e ricostruire correttamente la struttura dati è definito unswizzling, mentre la deserializzazione prevede il processo inverso di pointer swizzling.

## Conseguenze

La serializzazione comunque mina l'incapsulamento di un tipo di dato astratto esponendone potenzialmente i dettagli implementativi privati. Per scoraggiare i concorrenti dal realizzare prodotti compatibili con i propri spesso i produttori di software proprietari mantengono segreti i dettagli dei formati di serializzazione dei loro programmi. Alcuni offuscano o cifrano deliberatamente i dati serializzati.
Inoltre, l'interoperabilità richiede che le applicazioni siano in grado di comprendere le serializzazioni di ogni altra applicazione. Quindi le architetture di invocazione di metodi remoti quali CORBA definiscono i loro formati di serializzazione in dettaglio, e spesso forniscono metodi di verifica della consistenza di ogni flusso serializzato quando lo riconvertono in un oggetto.

## Serializzazione leggibile da esseri umani

Alla fine degli anni novanta si sono affermati protocolli alternativi a quelli standard usati in precedenza: il linguaggio di markup XML è stato usato per generare codice leggibile in formato testo. Questa tecnica è particolarmente utile per rendere gli oggetti persistenti comprensibili agli umani, oppure per trasmetterli ad altri sistemi che utilizzano diversi linguaggi di programmazione, anche se presenta lo svantaggio di perdere la compattezza di altri tipi di codifica byte-stream, di solito preferiti per motivi di praticità. Una possibile soluzione futura a questo problema potrebbero essere i cosiddetti schemi di compressione trasparente (vedere XML binario). XML è oggi spesso usato per trasferimenti sincroni di dati strutturati fra client e server in applicazioni WEB sviluppate in AJAX. In alternativa si usa JSON, un protocollo di serializzazione di tipo testo più leggero che utilizza la sintassi di JavaScript ma è supportato anche da molti altri linguaggi di programmazione.

## Supporto linguaggi di programmazione

Molti linguaggi di programmazione orientati agli oggetti supportano la serializzazione degli oggetti (detta a volte anche archiviazione degli oggetti), sia con la pratica dello zucchero sintattico, sia mediante interfacce standard appositamente progettate allo scopo. Fra gli altri si citano Ruby, Smalltalk, Python, Objective-C, Java, e la famiglia .NET.
Esistono anche librerie che consentono di aggiungere il supporto per la serializzazione a linguaggi che ne sono sprovvisti.

### Framework .NET

Nei linguaggi .NET, le classi possono essere serializzate e deserializzate aggiungendo l'attributo Serializable alla classe.