Guida alla serializzazione C ++

Guida alla serializzazione C ++
La serializzazione converte un oggetto in un flusso di byte da conservare nel disco o inviato a un altro computer attraverso una rete. Esistono due tipi di oggetti in C ++: oggetti e oggetti fondamentali istanziati da una classe definita. Nota, in C ++, la struttura è considerata una classe e il nome di una struttura rappresenta l'oggetto istanziato della struttura.

I singoli oggetti fondamentali non sono normalmente serializzati. Tuttavia, poiché un oggetto istanziato ha oggetti fondamentali, poiché l'intero oggetto viene serializzato, gli oggetti fondamentali vengono anche serializzati. In C ++, tutte le strutture di dati, come il vettore, sono classi predefinite.

La serializzazione è anche chiamata marshalling. L'opposto della serializzazione è la deserializzazione o la degradazione. L'oggetto serializzato come file dal disco o dalla rete può essere convertito (resuscitato) nell'oggetto sul computer locale da utilizzare con l'applicazione C ++ locale (programma).

Questo articolo ti guida per una migliore comprensione delle librerie di serializzazione C ++ e come scrivere la tua libreria di serializzazione. È focalizzato sul flusso standard serializzato, JSON - vedi sotto.

Contenuto dell'articolo

  • Flusso binario e di testo
  • Obiettivi principali
  • Json Stream
  • Sintassi JSON
  • Valore dei dati JSON
  • Confrontare gli oggetti C ++ e JSON
  • Di più da sapere
  • Conclusione

Flusso binario e di testo

Binario
Si dice che un programma C ++ compilato sia in forma binaria. Un flusso serializzato può essere in forma binaria. Tuttavia, questo articolo non prenderà in considerazione oggetti serializzati binari.

Testo
Il flusso serializzato può essere in forma di testo. Due standard di testo che vengono utilizzati oggi sono JSON e XML. È più facile da capire e gestire JSON che capire e gestire XML. Quindi JSON viene utilizzato in questo articolo.

Obiettivi principali

Gli obiettivi principali per la serializzazione sono che il flusso serializzato dovrebbe essere arretratamente compatibile e compatibile. Dovrebbe anche essere possibile utilizzare in diversi sistemi operativi e diverse architetture di computer.

Versione
Supponiamo di aver scritto un programma e di averlo spedito a un cliente e il cliente è soddisfatto. Questo va bene. Più tardi, il cliente ha bisogno di modifiche. Tuttavia, oggi, il cliente ha impiegato il proprio programmatore. Il programmatore ti chiede di aggiungere un'altra proprietà (membro dei dati) a una classe e inviare gli obiettivi corrispondenti attraverso la rete. Intende adattarsi all'oggetto nel programma; Quando lo fai, il flusso serializzato dovrà essere arretrato con il vecchio oggetto.

Le specifiche di C ++ e altre lingue cambiano nel tempo. In alcune specifiche, sei informato di alcune delle modifiche che avranno luogo nelle specifiche successive e future. Normalmente non è possibile informarti di tutte le modifiche che avranno luogo. Quindi, il tuo flusso serializzato dovrebbe essere compatibile in avanti, finché questi nuovi cambiamenti futuri sono preoccupati. La compatibilità in avanti ha i suoi limiti perché non è possibile determinare tutti i cambiamenti futuri.

Sia la compatibilità in avanti che indietro è gestita dallo schema chiamato versione.

Json Stream

JSON sta per la notazione dell'oggetto JavaScript.

JSON è un formato di testo per la memorizzazione e il trasporto di dati.

JSON è "autodescrizione".

JSON è anche uno standard vecchio e quindi si adatta bene alla serializzazione del testo C ++ e alla deserializzazione. Quindi, per inviare un oggetto istanziato C ++, convertilo in un oggetto JSON e invialo. Poco prima che venga inviato l'oggetto JSON, si chiama stream. Quando un oggetto JSON viene ricevuto nella sua sequenza, è ancora chiamato flusso per la deserializzazione.

Sintassi JSON

Con JSON, un dato è una coppia chiave/valore. Ad esempio, in

"Nome": "Smith"

il nome è una chiave e Smith è il valore. Un oggetto è delimitato da parentesi graffe, come in:

"nome": "Smith", "altezza": 1.7

I dati sono separati dalle virgole. Qualsiasi testo, che si tratti di una chiave o di un valore, deve essere in doppia citazione. I numeri sono scritti senza citazioni.

Un array è delimitato da parentesi quadrate come in:

["Orange", "Banana", "Pear", "Lemon"]

Nel seguente codice, esiste un dato il cui valore è un array e identificato da ARR

"arr": ["Orange", "Banana", "Pear", "Lemon"]

Nota: gli oggetti possono essere nidificati in JSON e con ciò, gli oggetti possono essere identificati.

Valore dei dati JSON

Il possibile valore del dato JSON è:

  • una stringa
  • un numero
  • un oggetto
  • un array
  • un booleano
  • nullo
  • una funzione (ma in doppio quote)

Una data C ++ o qualsiasi altro oggetto non in questo elenco deve essere convertita in una stringa letterale per diventare un valore JSON.

Confrontare gli oggetti C ++ e JSON

Quello che segue è un semplice programma C ++ con un oggetto semplice, di costruttore predefinito:

#includere
Utilizzo dello spazio dei nomi std;
Classe thecla

pubblico:
int num;
int mthd (int it)

restituirlo;

;
int main ()

Thecla obj;
int no = obj.MTHD (3);
cout << no << endl;
restituzione 0;

L'oggetto JSON equivalente è il seguente:

"obj": "num": null, "mthd": "int mthd (int it) return it;"

Un oggetto JSON è, per definizione, serializzato.

Nota come è stato indicato il nome dell'oggetto. Inoltre, nota come è stato indicato il nome della funzione. All'estremità ricevente, il programma C ++ lì per la deserializzazione dovrà convertirlo in una classe e un oggetto C ++ e quindi compilare. Il programma dovrà inoltre riconoscere la funzione in forma di stringa, rimuovere le doppie citazioni e avere la funzione come testo prima di compilare.

Per facilitare questo, i metadati dovrebbero essere inviati. I metadati sono dati sui dati. È possibile inviare una mappa C ++ con i metadati. Una mappa è un oggetto C ++ stesso, che dovrà essere convertito in un oggetto JSON. Verrà inviato, seguito dall'oggetto di interesse JSON.

L'oggetto JSON è un oggetto Stream. Dopo che è stato preparato, dovrebbe essere inviato all'oggetto Ostream C ++ per essere salvato come file o inviato attraverso la rete. Al computer ricevente, C ++ Istream riceverà la sequenza. Sarà quindi preso dal programma di deserializzazione che riprodurrà l'oggetto in formato C ++. Ostream e Istream sono oggetti di C ++ Fstream.

Nota: in JavaScript (ECMAScript), viene chiamata la serializzazione, le stringhe e la deserializzazione si chiama analisi.

Oggetto JSON e oggetto JavaScript

L'oggetto JSON e l'oggetto JavaScript sono simili. L'oggetto JavaScript ha meno restrizioni rispetto all'oggetto JSON. L'oggetto JSON è stato progettato dall'oggetto JavaScript, ma oggi può essere utilizzato da molti altri linguaggi di computer. JSON è l'archivio più comune (sequenza serializzata) utilizzato per inviare dati tra i server Web e i loro client. Le biblioteche C ++ usano JSON, ma nessuno di loro soddisfa la maggior parte degli obiettivi di produrre un archivio per C++.

Nota: in JavaScript, una funzione non è una stringa. Qualsiasi funzione ricevuta come stringa viene convertita in una normale funzione di sintassi.

Di più da sapere

Oltre a conoscere quanto sopra, al fine di produrre una libreria di serializzazione o deserializzazione per te, devi anche sapere:

  • Come esprimere i puntatori C ++ in oggetti in formato JSON;
  • Come esprimere l'eredità di C ++ in formato JSON;
  • Come esprimere il polimorfismo C ++ in formato JSON; E
  • Altro su JSON.

Conclusione

La serializzazione converte un oggetto in un flusso di byte da conservare nel disco o inviato a un altro computer attraverso una rete. La deserializzazione è il processo invertito per il flusso serializzato, che è chiamato archivio.

Sia gli oggetti fondamentali che gli oggetti istanziati possono essere serializzati. Gli oggetti fondamentali singoli sono appena serializzati. Tuttavia, poiché un oggetto istanziato ha oggetti fondamentali, gli oggetti fondamentali vengono serializzati insieme al tutto.

La serializzazione ha uno svantaggio che espone i membri privati ​​dell'oggetto C ++. Questo problema può essere risolto facendo serializzazione in binario. Con il testo, i metadati possono essere inviati per indicare i membri privati; Ma il programmatore dall'altra parte potrebbe ancora conoscere i membri privati.

Potresti già aver salvato sul disco o inviato un programma binario o di codice sorgente tramite l'e -mail e potresti chiederti: perché salvare o inviare solo l'oggetto. Bene, in C ++, potresti aver capito che un'intera biblioteca può essere composta da una sola classe, possibilmente con una certa eredità. La classe potrebbe essere più lunga di molti brevi programmi C ++. Quindi, uno dei motivi per inviare oggetti è perché alcuni oggetti sono troppo grandi. La programmazione orientata agli oggetti (OOP) comporta l'interazione di oggetti, simile a come interagiscono animali, piante e strumenti. Un altro motivo è che OOP sta migliorando e i programmatori preferiscono affrontare gli oggetti rispetto all'intera applicazione, che può essere troppo grande.

C ++ non ha ancora un formato di archivio standard per testo o binario, sebbene ci siano librerie di serializzazione per la serializzazione e la deserializzazione C ++. Nessuno di loro è davvero soddisfacente. Il formato dell'archivio di testo per JavaScript è JSON. JSON può essere utilizzato con qualsiasi lingua di computer. Quindi, con la guida di cui sopra, dovresti essere in grado di produrre la tua libreria per il marshaling C ++ e il senza moshalling.