Guide de la sérialisation C ++

Guide de la sérialisation C ++
La sérialisation convertit un objet en un flux d'octets à stocker sur le disque ou envoyé à un autre ordinateur via un réseau. Il existe deux types d'objets en C ++: des objets et des objets fondamentaux instanciés à partir d'une classe définie. Remarque, en C ++, la structure est considérée comme une classe, et le nom d'une structure représente l'objet instancié de la structure.

Les objets fondamentaux individuels ne sont normalement pas sérialisés. Cependant, comme un objet instancié a des objets fondamentaux, comme l'objet entier est sérialisé, les objets fondamentaux sont également sérialisés. En C ++, toutes les structures de données, comme le vecteur, sont des classes prédéfinies.

La sérialisation est également appelée maréchalage. L'opposé de la sérialisation est la désérialisation ou la non-arshalling. L'objet sérialisé en tant que fichier du disque ou du réseau peut être converti (ressuscité) en l'objet de l'ordinateur local à utiliser avec l'application C ++ locale (programme).

Cet article vous guide sur une meilleure compréhension des bibliothèques de sérialisation C ++ et comment rédiger votre propre bibliothèque de sérialisation. Il est axé sur le flux standard sérialisé, JSON - voir ci-dessous.

Contenu de l'article

  • Flux binaire et de texte
  • Objectifs principaux
  • JSON Stream
  • Syntaxe JSON
  • Valeur de données JSON
  • Comparaison des objets C ++ et JSON
  • Plus à savoir
  • Conclusion

Flux binaire et de texte

Binaire
Un programme C ++ compilé serait sous forme binaire. Un flux sérialisé peut être sous forme binaire. Cependant, cet article ne considérera pas les objets binaires en série.

Texte
Le flux sérialisé peut être sous forme de texte. Deux normes de texte qui sont utilisées aujourd'hui sont JSON et XML. Il est plus facile de comprendre et de gérer JSON que de comprendre et de gérer XML. Donc json est utilisé dans cet article.

Objectifs principaux

Les principaux objectifs de sérialisation sont que le flux sérialisé doit être compatible en arrière et compatible. Il devrait également être possible d'être utilisé dans différents systèmes d'exploitation et différentes architectures informatiques.

Version
Supposons que vous avez écrit un programme et l'avez expédié à un client, et que le client est satisfait. C'est bon. Plus tard, le client a besoin de modifications. Cependant, aujourd'hui, le client a utilisé son propre programmeur. Le programmeur vous demande d'ajouter une autre propriété (membre de données) à une classe et d'envoyer les objectifs correspondants via le réseau. Il a l'intention d'adapter l'objet dans le programme; Lorsque vous faites cela, le flux sérialisé devra être compatible en arrière avec l'ancien objet.

La spécification de C ++ et d'autres langues changent avec le temps. Dans certaines spécifications, vous êtes informé de certains des changements qui auront lieu dans les spécifications suivantes et futures. Il n'est normalement pas possible de vous informer de tous les changements qui auront lieu. Ainsi, votre flux sérialisé devrait être compatible en avant, tant que ces nouveaux changements futurs sont concernés. La compatibilité à terme a ses limites car tous les changements futurs ne peuvent pas être déterminés.

La compatibilité avant et vers l'arrière est gérée par le schéma appelé versioning.

JSON Stream

JSON représente la notation d'objet JavaScript.

JSON est un format texte pour stocker et transporter des données.

JSON est «auto-décrit».

JSON est également une ancienne norme, et il convient donc bien à la sérialisation du texte C ++ et à la désérialisation. Donc, pour envoyer un objet instancié C ++, convertissez-le en un objet JSON et envoyez. Juste avant l'envoi de l'objet JSON, il s'appelle un flux. Lorsqu'un objet JSON est reçu dans sa séquence, il est toujours appelé flux de désérialisation.

Syntaxe JSON

Avec JSON, une donnée est une paire clé / valeur. Par exemple, dans

"Nom": "Smith"

Le nom est une clé, et Smith est la valeur. Un objet est délimité par des accolades, comme dans:

"Name": "Smith", "Height": 1.7

Les données sont séparées par des virgules. Tout texte, qu'il s'agisse d'une clé ou d'une valeur, doit être en double quot. Les numéros sont écrits sans citations.

Un tableau est délimité par des crochets comme dans:

["orange", "banane", "poire", "citron"]

Dans le code suivant, il y a une donnée dont la valeur est un tableau et identifié par arrond

"arr": ["orange", "banane", "poire", "citron"]

Remarque: les objets peuvent être imbriqués en JSON, et avec cela, les objets peuvent être identifiés.

Valeur de données JSON

La valeur de la référence JSON possible est:

  • un string
  • un numéro
  • un objet
  • un tableau
  • un booléen
  • nul
  • une fonction (mais en double-quotes)

Une date C ++ ou tout autre objet non dans cette liste doit être converti en une chaîne littérale pour devenir une valeur JSON.

Comparaison des objets C ++ et JSON

Ce qui suit est un programme C ++ simple avec un objet simple, de constructeur par défaut:

#inclure
Utilisation de Namespace Std;
classe TheCla

public:
int num;
int mthd (int it)

rends le;

;
int main()

Thecla obj;
int no = obj.MTHD (3);
couter << no << endl;
retour 0;

L'objet JSON équivalent est le suivant:

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

Un objet JSON est, par définition, sérialisé.

Notez comment le nom de l'objet a été indiqué. Notez également comment le nom de la fonction a été indiqué. À la fin de réception, le programme C ++ là-bas pour la désérialisation devra convertir cela en classe et objet C ++, puis compiler. Le programme devra également reconnaître la fonction sous forme de chaîne, supprimer les doubles citations et avoir la fonction comme texte avant de compiller.

Pour faciliter cela, les métadonnées doivent être envoyées. Les métadonnées sont des données sur les données. Une carte C ++ avec les métadonnées peut être envoyée. Une carte est un objet C ++ lui-même, qui devra être converti en un objet JSON. Il sera envoyé, suivi par l'objet JSON d'intérêt.

L'objet JSON est un objet Stream. Après sa préparation, il doit être envoyé à l'objet OSstream C ++ à enregistrer en tant que fichier ou envoyé via le réseau. Sur l'ordinateur de réception, le C ++ Istream recevra la séquence. Il sera ensuite suivi par le programme de désérialisation qui reproduira l'objet au format C ++. Osstream et Istream sont des objets de C ++ FStream.

Remarque: Dans JavaScript (ECMAScript), la sérialisation est appelée, le strifiage et la désérialisation sont appelés l'analyse.

Objet JSON et objet JavaScript

L'objet JSON et l'objet JavaScript sont similaires. L'objet JavaScript a moins de restrictions que l'objet JSON. L'objet JSON a été conçu à partir de l'objet JavaScript, mais aujourd'hui, il peut être utilisé par de nombreux autres langages informatiques. JSON est l'archive la plus courante (séquence sérialisée) utilisée pour envoyer des données entre les serveurs Web et leurs clients. Les bibliothèques C ++ utilisent JSON, mais aucun d'entre eux ne satisfait la plupart des objectifs de la production d'une archive pour C++.

Remarque: Dans JavaScript, une fonction n'est pas une chaîne. Toute fonction reçue comme une chaîne est convertie en une fonction de syntaxe normale.

Plus à savoir

En plus de connaître ce qui précède, afin de produire une bibliothèque de sérialisation ou de désérialisation pour vous-même, vous devez également savoir:

  • Comment exprimer des pointeurs C ++ au format JSON;
  • Comment exprimer l'héritage C ++ au format JSON;
  • Comment exprimer le polymorphisme C ++ au format JSON; et
  • Plus sur JSON.

Conclusion

La sérialisation convertit un objet en un flux d'octets à stocker sur le disque ou envoyé à un autre ordinateur via un réseau. La désérialisation est le processus inversé du flux sérialisé, qui est appelé l'archive.

Les objets fondamentaux et les objets instanciés peuvent être sérialisés. Les objets fondamentaux uniques sont à peine sérialisés. Cependant, comme un objet instancié a des objets fondamentaux, les objets fondamentaux sont sérialisés à côté de l'ensemble.

La sérialisation présente un inconvénient qu'il expose les membres privés de l'objet C ++. Ce problème peut être résolu en faisant la sérialisation en binaire. Avec du texte, les métadonnées peuvent être envoyées pour indiquer les membres privés; Mais le programmeur à l'autre bout peut encore connaître les membres privés.

Vous avez peut-être déjà enregistré sur le disque ou envoyé un programme de code binaire ou source par e-mail, et vous vous demandez peut-être: pourquoi enregistrer ou envoyer uniquement l'objet. Eh bien, en C ++, vous avez peut-être réalisé qu'une bibliothèque entière peut être constituée d'une seule classe, peut-être avec un certain héritage. La classe peut être plus longue que de nombreux programmes C ++ courts. Ainsi, une des raisons d'envoyer des objets est que certains objets sont trop grands. La programmation orientée objet (POO) implique l'interaction d'objets, similaire à la façon dont les animaux, les plantes et les outils interagissent. Une autre raison est que la POO s'améliore et que les programmeurs préfèrent faire face aux objets que toute l'application, qui peut être trop grande.

C ++ n'a pas encore de format d'archives standard pour le texte ou le binaire, bien qu'il existe des bibliothèques de sérialisation pour la sérialisation C ++ et la désérialisation. Aucun d'eux n'est vraiment satisfaisant. Le format d'archives de texte pour JavaScript est JSON. JSON peut être utilisé avec n'importe quel langage informatique. Ainsi, avec le guide ci-dessus, vous devriez être en mesure de produire votre propre bibliothèque pour le marshaling C ++ et le non-arshalling.