reseaux:generalites:serialisation

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
reseaux:generalites:serialisation [2022/08/16 17:35] philreseaux:generalites:serialisation [2022/09/07 19:34] (Version actuelle) phil
Ligne 1: Ligne 1:
 [[reseaux:accueilreseaux|{{ :iconemaison.jpg?nolink&30|Sommaire "Réseau et communication"}}]] [[reseaux:accueilreseaux|{{ :iconemaison.jpg?nolink&30|Sommaire "Réseau et communication"}}]]
  
-===== La représentation des données ===== +===== La sérialisation ===== 
-[Mise à jour le 19/12/2021]+[Mise à jour le 16/8/2022]
  
   * **Source** : Mooc Fun "Programmer l'internet des objets"   * **Source** : Mooc Fun "Programmer l'internet des objets"
      
-====1. Pourquoi il n'est pas si simple d'envoyer une donnée ? ==== +==== 1. Présentation ==== 
-  * **Vidéo** sur YouTube: <html><a href="https://www.youtube.com/watch?v=k-RhgiwKx2M&t=134s" target="_blank">La sérialisation</a></html> +<callout type="primary" icon="true">Sous ce nom barbare se cache la **méthode utilisée pour transmettre des données d’un ordinateur à un autre**.</callout> 
- +
-<note important>Envoyer une donnée sur un réseau n’est pas aussi simple que l’on croit. (voir la **vidéo**)</note> +
- +
-Il faut faire la différence entre le format utilisé pour stocker des données dans la mémoire de l'ordinateur et celui employé pour l'envoyer à une autre machine. En effet, **chaque machine à sa propre représentation** souvent liée aux capacités de son processeur. Cela est **surtout vrai pour les nombres**. Ils peuvent être stockés sur un nombre de bits plus ou moins important ou peuvent être représentés en mémoire de manière optimisée pour accélérer leur traitement.  +
- +
-En revanche, la représentation des **chaînes de caractères** (**non accentués**) est relativement uniforme, car elle se base sur le code **ASCII** qui est le même pour tous les ordinateurs.  +
- +
-<callout type="primary" icon="true">Un texte de base est facilement compréhensible par toutes les machines.</callout> +
- +
-Une solution serait donc de n'utiliser que des chaînes de caractères. Par exemple, si l’on veut envoyer l'entier ayant pour valeur **123**, il existe plusieurs représentations possibles : +
-  * envoyer une chaîne de caractères **”123”** contenant les chiffres du nombre ; +
-  * envoyer la valeur binaire **1111011**. +
- +
-On voit que juste pour transmettre une simple valeur stockée dans la mémoire d'un ordinateur, il existe plusieurs options et évidemment pour que cette valeur soit interprétée de la bonne façon, **il faut que les deux extrémités se soient mises d'accord sur une représentation**. +
- +
-<note warning>Quand on veut transmettre plusieurs valeurs, c'est-à-dire quand on a des données structurées, d'autres problèmes surviennent.</note> +
- +
-Par exemple :  +
-  * Quelle est la taille des blocs que l’on va transmettre ?  +
-  * Comment indiquer la fin de la transmission ?  +
-  * Pour une chaîne de caractères, comment indiquer qu’elle se termine ?  +
- +
-Autre exemple : si l'on veut transmettre "12" puis "3", comment faire pour que l'autre extrémité ne comprenne pas "123"+
- +
-<note tip>Pour que la transmission se fasse correctement, il faut que l’émetteur et le récepteur adoptent les mêmes conventions.</note>  +
- +
-{{ :reseaux:generalites:csv.png?nolink100|}} +
-Quand il s’agit d’un ensemble de données, il faut être capable de les séparer. Avec les **tableurs**, une première méthode est possible avec la **__notation__ CSV** (pour **Comma Separated Values**). Comme son nom l’indique, les valeurs sont séparées par des virgules. Les valeurs sont représentées par des chaînes de caractères. Les textes sont différenciés des valeurs numériques, par l’utilisation de guillemets. Ainsi, 123 sera interprété comme un nombre et ”123” comme un texte. +
- +
-Si cette représentation est adaptée aux tableurs, elle est relativement pauvre, car elle ne permet de représenter que des valeurs sur des lignes et des colonnes.  +
- +
-{{ :reseaux:generalites:web.png?nolink100|}} +
-Pour les usages du Web, il a fallu trouver un format plus souple permettant de représenter des structures de données complexes. Évidemment, comme rien n'est simple, il en existe plusieurs et les applications échangeant des données devront utiliser le même. +
- +
-<callout type="primary" icon="true">**Conclusion** : on voit que **l'envoi de la chaîne de caractères ne suffit pas**, il faut la **formater** pour que le récepteur puisse trouver le type de la donnée transmise, qu'un nombre ne soit pas interprété comme une chaîne de caractères, qu'une chaîne de caractères reste une chaîne de caractères même si elle ne contient que des chiffres.</callout> +
- +
-==== 2. La sérialisation ==== +
-<callout type="primary" icon="true">Sous ce nom barbare se cache la méthode utilisée pour transmettre des données d’un ordinateur à un autre.</callout> +
 Une **donnée** peut être **simple** (**un nombre**, **un texte**) ou plus **complexe** (un **tableau**, une **structure**...). Elle est stockée dans la mémoire de l'ordinateur suivant une représentation qui lui est propre. Par exemple, la taille des entiers peut varier d'une technologie de processeur à une autre, l'ordre des octets dans un nombre peut aussi être différent (<html><a href="https://fr.wiktionary.org/wiki/little-endian" target="_blank">little</a></html> et <html><a href="https://fr.wiktionary.org/wiki/big-endian" target="_blank">big endian</a></html>). Pour des structures complexes comme les tableaux, les éléments peuvent être rangés à différents emplacements de la mémoire.  Une **donnée** peut être **simple** (**un nombre**, **un texte**) ou plus **complexe** (un **tableau**, une **structure**...). Elle est stockée dans la mémoire de l'ordinateur suivant une représentation qui lui est propre. Par exemple, la taille des entiers peut varier d'une technologie de processeur à une autre, l'ordre des octets dans un nombre peut aussi être différent (<html><a href="https://fr.wiktionary.org/wiki/little-endian" target="_blank">little</a></html> et <html><a href="https://fr.wiktionary.org/wiki/big-endian" target="_blank">big endian</a></html>). Pour des structures complexes comme les tableaux, les éléments peuvent être rangés à différents emplacements de la mémoire. 
  
-<note tip>La <html><a href="https://fr.wikipedia.org/wiki/S%C3%A9rialisation" target="_blank">sérialisation</a></html> consiste à transformer une structure de données en une séquence qui pourra être transmise sur le réseau, stockée dans un fichier ou une base de données.</note+<callout type="tip" icon="true">La <html><a href="https://fr.wikipedia.org/wiki/S%C3%A9rialisation" target="_blank">sérialisation</a></html> consiste à transformer une structure de données en une séquence qui pourra être transmise sur le réseau, stockée dans un fichier ou une base de données.</callout>
 L'opération inverse, consistant à reconstruire localement une structure de données, s'appelle **désérialisation**.  L'opération inverse, consistant à reconstruire localement une structure de données, s'appelle **désérialisation**. 
  
Ligne 58: Ligne 20:
 **Les caractères en orange ne sont pas imprimables**. Ils permettent de contrôler la communication des données ou de gérer l'affichage en revenant à la ligne. On les reconnait, car la séquence binaire commence par 00X XXXX.  **Les caractères en orange ne sont pas imprimables**. Ils permettent de contrôler la communication des données ou de gérer l'affichage en revenant à la ligne. On les reconnait, car la séquence binaire commence par 00X XXXX. 
  
-<callout type="primary" icon="true">Le code ASCII est sur **7 bits** ; le bit supplémentaire (bit de parité) conduisant à 1 octet était utilisé pour détecter des erreurs de transmission. Les valeurs de **0x30** à **0x39** codent les **chiffres de 0 à 9**.</callout>+<callout type="primary" icon="true">Le **code ASCII est sur 7 bits** ; le bit supplémentaire (bit de parité) conduisant à 1 octet était utilisé pour détecter des erreurs de transmission. Les valeurs de **0x30** à **0x39** codent les **chiffres de 0 à 9**.</callout>
  
-=== 2.Codage ASCII ===+==== 2. Codage ASCII ====
 {{ :reseaux:generalites:asciiico.png?nolink&80|}} {{ :reseaux:generalites:asciiico.png?nolink&80|}}
 **Exemple en Python**\\ **Exemple en Python**\\
Ligne 73: Ligne 35:
  
 val = b"\x01\x0234" val = b"\x01\x0234"
-ser = binascii.hexlify (val)+ser = binascii.hexlify(val)
 print (f"La variable val ({val}) occupe {len(val)} octets") # La variable val (b'\x01\x0234') occupe 4 octets print (f"La variable val ({val}) occupe {len(val)} octets") # La variable val (b'\x01\x0234') occupe 4 octets
 print (f"La variable ser ({ser}) occupe {len(ser)} octets") # La variable ser (b'01023334') occupe 8 octets print (f"La variable ser ({ser}) occupe {len(ser)} octets") # La variable ser (b'01023334') occupe 8 octets
Ligne 80: Ligne 42:
 En **Python**, la variable **//val//** occupe 4 octets et **//ser//** en occupe 8 car il faut deux caractères pour représenter un octet. En **Python**, la variable **//val//** occupe 4 octets et **//ser//** en occupe 8 car il faut deux caractères pour représenter un octet.
    
-<note warning>Le passage d'une séquence binaire à une chaîne de caractères ASCII en représentant les valeurs conduit à un **doublement du volume**. Chaque bloc de 4 bits va conduire à produire un octet correspondant au caractère d'un chiffre ou d'une lettre de A à F. Le reste des codes n'est pas utilisé.</note>+<callout  icon="fa fa-hand-stop-o" color="red" title="ATTENTION">Le passage d'une séquence binaire à une chaîne de caractères ASCII en représentant les valeurs conduit à un **doublement du volume**. Chaque bloc de 4 bits va conduire à produire un octet correspondant au caractère d'un chiffre ou d'une lettre de A à F. Le reste des codes n'est pas utilisé.</callout>
  
-===2.Codage Base 64 ===+====3. Codage Base 64 ====
 {{ :reseaux:generalites:b64.png?nolink&80|}} {{ :reseaux:generalites:b64.png?nolink&80|}}
 En utilisant 64 bits pour coder les valeurs le **codage base64** offre un **meilleur rendement** que l'ASCII .  En utilisant 64 bits pour coder les valeurs le **codage base64** offre un **meilleur rendement** que l'ASCII . 
-<note tip>Un **dictionnaire** fait la correspondance entre 64 valeurs et un caractère ASCII.</note> Cependant, si l'on veut coder 4 octets, soit 32 bits, il faudra 5 blocs de 6 bits, et il y aura deux bits restants. Le symbole **=** indique que 2 bits sont ajoutés à la fin du codage. Donc, dans notre cas, il faudra ajouter deux symboles = comme le montre la figure ci-dessous :+ 
 +<callout type="tip" icon="true">Un **dictionnaire** fait la correspondance entre 64 valeurs et un caractère ASCII.</note> Cependant, si l'on veut coder 4 octets, soit 32 bits, il faudra 5 blocs de 6 bits, et il y aura deux bits restants. Le symbole **=** indique que 2 bits sont ajoutés à la fin du codage. </callout> 
 + 
 +Donc, dans notre cas, il faudra ajouter deux symboles = comme le montre la figure ci-dessous :
 {{ :reseaux:generalites:base64.png?nolink&650 |}} {{ :reseaux:generalites:base64.png?nolink&650 |}}
  
-<note warning>On notera que **pour les petites séquences**, ce codage n'est pas meilleur que la transformation de la séquence hexadécimale en chaîne de caractères. Ici, il faut 8 caractères pour coder 4 octets.</note>+<callout  icon="fa fa-hand-stop-o" color="red" title="ATTENTION">On notera que **pour les petites séquences**, ce codage n'est pas meilleur que la transformation de la séquence hexadécimale en chaîne de caractères. Ici, il faut 8 caractères pour coder 4 octets.</callout>
  
 En Python3, le module <html><a href="https://www.asciitohex.com" target="_blank">base64</a></html> permet de faire ces conversions. En Python3, le module <html><a href="https://www.asciitohex.com" target="_blank">base64</a></html> permet de faire ces conversions.
Ligne 104: Ligne 69:
 </code> </code>
  
-<note tip>Il existe beaucoup d'outils en ligne pour faire les conversions entre ces différentes représentations, comme le site <html><a href="https://www.asciitohex.com/" target="_blank">www.asciitohex.com</a></html></note+<callout type="tip" icon="true">Il existe beaucoup d'outils en ligne pour faire les conversions entre ces différentes représentations, comme le site <html><a href="https://www.asciitohex.com/" target="_blank">www.asciitohex.com</a></html></callout> 
-=== 2.3 HTML5 ===+ 
 +==== 4 HTML5 ====
 {{ :reseaux:generalites:html5.png?nolink&80|}} {{ :reseaux:generalites:html5.png?nolink&80|}}
 La **sérialisation** en **chaînes de caractères** (par exemple en Python via la commande hexlify) ou en base64 concerne surtout des **données binaires**. Mais la donnée peut être aussi structurée, par exemple la page d'un **tableur**.  La **sérialisation** en **chaînes de caractères** (par exemple en Python via la commande hexlify) ou en base64 concerne surtout des **données binaires**. Mais la donnée peut être aussi structurée, par exemple la page d'un **tableur**. 
-<note important>Il faut donc formater le document pour éviter une fusion des différents champs.</note>+ 
 +<callout type="warning" icon="true">Il faut donc formater le document pour éviter une fusion des différents champs.</callout> 
 Le format **CSV** (**Comma Separated Values**), comme son nom l'indique, sépare les données par des virgules (comma en anglais). Mais si ce format s'applique bien aux données d'un tableau, c'est-à-dire un tableau de lignes et de colonnes, il est très limité pour représenter une information telle que la mise en forme d'une page Web. Le format **CSV** (**Comma Separated Values**), comme son nom l'indique, sépare les données par des virgules (comma en anglais). Mais si ce format s'applique bien aux données d'un tableau, c'est-à-dire un tableau de lignes et de colonnes, il est très limité pour représenter une information telle que la mise en forme d'une page Web.
  
 **HTML** (**Hyper Text Markup Language**), définit un **format** où les champs sont repérés par un **balisage**.  Une **balise** de début est un **mot clé** entre **<>** et, pour une balise de fin, le mot clé est précédé du caractère **/**. Le navigateur est capable d'analyser une page Web  pour trouver les **URI** qu'elle contient. Une balise img indiquant qu'il s'agit d'une image, le client peut interroger le serveur pour l'afficher à l'écran.  **HTML** (**Hyper Text Markup Language**), définit un **format** où les champs sont repérés par un **balisage**.  Une **balise** de début est un **mot clé** entre **<>** et, pour une balise de fin, le mot clé est précédé du caractère **/**. Le navigateur est capable d'analyser une page Web  pour trouver les **URI** qu'elle contient. Une balise img indiquant qu'il s'agit d'une image, le client peut interroger le serveur pour l'afficher à l'écran. 
-<note tip>Ce **format structuré de sérialisation** nous permet de mettre en place une caractéristique de **REST**, c'est-à-dire les liens entre ressources.</note> 
  
-=== 2.XML ===+<callout type="tip" icon="true">Ce **format structuré de sérialisation** nous permet de mettre en place une caractéristique de **REST**, c'est-à-dire les liens entre ressources.</callout> 
 + 
 +==== 5. XML ====
 {{ :reseaux:generalites:xml.png?nolink&80|}} {{ :reseaux:generalites:xml.png?nolink&80|}}
 Si HTML est dédié au formatage à l'écran de données textuelles et à la navigation sur le Web, **XML** (**eXtensible Markup Language**), défini par le **W3C**, est un format d’**échange entre deux applications**. Si HTML est dédié au formatage à l'écran de données textuelles et à la navigation sur le Web, **XML** (**eXtensible Markup Language**), défini par le **W3C**, est un format d’**échange entre deux applications**.
Ligne 129: Ligne 98:
 S'il est syntaxiquement correct, rien ne dit que le créateur fournit quelque chose de correct qui pourra être interprété par une autre instance.  XML peut inclure une grammaire ou un schéma qui est utilisé pour valider que les informations représentées dans le fichier sont non seulement syntaxiquement conformes au langage XML, mais aussi conformes au schéma. Ce schéma va décrire les champs attendus et leur type (texte, nombre...). S'il est syntaxiquement correct, rien ne dit que le créateur fournit quelque chose de correct qui pourra être interprété par une autre instance.  XML peut inclure une grammaire ou un schéma qui est utilisé pour valider que les informations représentées dans le fichier sont non seulement syntaxiquement conformes au langage XML, mais aussi conformes au schéma. Ce schéma va décrire les champs attendus et leur type (texte, nombre...).
  
-<note important>Du point de vue de l’**internet des objets**, même si le **XML** pourrait être un bon candidat pour l’échange d’informations, il est un **format trop lourd** et donc **énergivore**. On peut noter que pour envoyer une note sur 20 qui, dans l'absolu, prendrait 6 bits, on transmet <nowiki><note>18</note></nowiki>, soit 15 caractères.</note+<callout type="warning" icon="true">Du point de vue de l’**internet des objets**, même si le **XML** pourrait être un bon candidat pour l’échange d’informations, il est un **format trop lourd** et donc **énergivore**. On peut noter que pour envoyer une note sur 20 qui, dans l'absolu, prendrait 6 bits, on transmet <nowiki><note>18</note></nowiki>, soit 15 caractères.</callout
  
-=== 2.JSON ===+==== 6. JSON ====
 {{ :reseaux:generalites:json.png?nolink&80|}} {{ :reseaux:generalites:json.png?nolink&80|}}
   * **Vidéo** sur YouTube: <html><a href="https://www.youtube.com/watch?v=IhZ9w6jWnq8&t=1s" target="_blank">JSON</a></html>   * **Vidéo** sur YouTube: <html><a href="https://www.youtube.com/watch?v=IhZ9w6jWnq8&t=1s" target="_blank">JSON</a></html>
Ligne 176: Ligne 145:
 **Le balisage par clé est un élément fondamental dans la structure des données**. Il est primordial d'être cohérent et d'assurer une concordance entre émetteur et récepteur sur l'intitulé de la clé pour pouvoir récupérer l'information voulue. De la même façon, il faut s'accorder sur les unités de mesure : une interprétation d'une mesure en centimètre alors qu'elle est en pixel peut être désastreux ; c'est un **problème d'interopérabilité**. **Le balisage par clé est un élément fondamental dans la structure des données**. Il est primordial d'être cohérent et d'assurer une concordance entre émetteur et récepteur sur l'intitulé de la clé pour pouvoir récupérer l'information voulue. De la même façon, il faut s'accorder sur les unités de mesure : une interprétation d'une mesure en centimètre alors qu'elle est en pixel peut être désastreux ; c'est un **problème d'interopérabilité**.
  
-<note tip>JSON est facilement exploitable dans d’autres langages. Par exemple en **Python**, le **module JSON** peut être utilisé pour convertir une structure JSON qui est une chaîne ASCII en une représentation interne Python. Les tableaux sont convertis en listes et les objets en dictionnaires.</note>+<callout type="tip" icon="true">JSON est facilement exploitable dans d’autres langages. Par exemple en **Python**, le **module JSON** peut être utilisé pour convertir une structure JSON qui est une chaîne ASCII en une représentation interne Python. Les tableaux sont convertis en listes et les objets en dictionnaires.</callout>
  
 Le programme example_json.py  Le programme example_json.py 
Ligne 259: Ligne 228:
 <callout type="primary" icon="true">Les autres langues de programmation possèdent également leur propre bibliothèque pour effectuer la traduction.</callout> <callout type="primary" icon="true">Les autres langues de programmation possèdent également leur propre bibliothèque pour effectuer la traduction.</callout>
  
-=== 2.CBOR ===+==== 7. CBOR ====
 {{ :reseaux:generalites:cbor.png?nolink&80|}} {{ :reseaux:generalites:cbor.png?nolink&80|}}
 Voir [[reseaux:generalites:cbor|"La sérialisation" (suite)]] Voir [[reseaux:generalites:cbor|"La sérialisation" (suite)]]
  • reseaux/generalites/serialisation.1660664113.txt.gz
  • Dernière modification : 2022/08/16 17:35
  • de phil