CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
SITEMAP
Audiobooks by Valerio Di Stefano: Single Download - Complete Download [TAR] [WIM] [ZIP] [RAR] - Alphabetical Download  [TAR] [WIM] [ZIP] [RAR] - Download Instructions

Make a donation: IBAN: IT36M0708677020000000008016 - BIC/SWIFT:  ICRAITRRU60 - VALERIO DI STEFANO or
Privacy Policy Cookie Policy Terms and Conditions
Sérialisation - Wikipédia

Sérialisation

Un article de Wikipédia, l'encyclopédie libre.

Vous avez de nouveaux messages (diff ?).
La sérialisation peut aussi désigner l'ordonnancement de taches concurrentes en attente d'une ressource dans une file d'attente

En informatique la sérialisation (ou marshalling en anglais) est un processus visant à encoder l'état d'un objet qui est en mémoire sous la forme d'une chaîne d'octets dans un flux de données. Cette chaîne d'octet pourra par exemple être utilisée pour la sauvegarde sur disque (persistance) ou le transport sur le réseau (proxy, RPC..). L'activité inverse, visant à décoder la suite d'octets pour créer une copie conforme des objets d'origine, s'appelle la désérialisation (ou unmarshalling).

D'apparence simple, ces opérations posent en réalité un certain nombre de problèmes, comme par exemple la gestion des références entres objets ou la portabilité des encodages. Par ailleurs les choix entre les diverses techniques de sérialisations ont une influence sur les critères de performances comme la taille des chaînes d'octet sérialisées ou la vitesse de traitement.

Sommaire

[modifier] Contexte

Comme pour beaucoup de choix algorithmiques, plus le mécanisme de sérialisation est spécialisé pour un type de donnée spécifique, plus il sera performant. Par exemple, si on ne veut transmettre que dix nombres dont les valeurs sont comprises entre 0 et 255, il suffira de 10 octets. Si par contre on ne sait pas à l'avance la quantité d'objet à transmettre il faudra au moins prévoir un octet supplémentaire pour transmettre cette quantité. Si par contre ce ne sont plus seulement des nombres entiers, mais des objets quelconques que l'on souhaite transmettre, il faudra prévoir d'y associer les informations qui permettront de retrouver le type précis de chaque objet.

Plus globalement, il est nécessaire de faire un a priori sur les ressources disponibles au moment de la désérialisation pour déterminer les informations que l'on pourra reconstruire à l'aide d'une simple référence et celles qu'il est nécessaires d'encoder. C'est par exemple le cas des polices de caractères dans un fichier PDF: selon que l'on souhaite privilégier la taille du fichier généré ou l'exactitude du rendu sur toutes les machines, il est possible de transmettre la définition complète des polices de caractères ou de se contenter de leur nom et de quelques autres caractéristiques de bases, en laissant le soin aux machines cibles de rechercher la police la plus adaptée parmi celles dont elle dispose.

Il existe enfin des informations qui ne peuvent pas être sérialisés, et qu'il faudra de toute façon reconstruire. C'est le cas par exemple d'un descripteur de fichiers. D'une machine à l'autre et même d'une exécution à l'autre du programme sur une même machine, ces numéros sont attribués de manière arbitraire par le système d'exploitation. Il n'y a donc pas de sens à sérialiser ces numéros de fichier et il faudra encoder les informations qui permettront de le reconstruire, par exemple le chemin du fichier à ouvrir. Un cas typique, est l'encodage des pointeurs en mémoire, qui fait l'objet d'une technique spécifique: la mutation de pointeurs (swizzling en anglais).

[modifier] Encodage

Le choix de base est entre format texte et format binaire:

  • les fichiers binaires sont généralement plus compacts, le code pour parser ce type de données est plus simple à mettre au point, la lecture et l'écriture sont moins exigeantes en ressources processeurs.
  • les fichiers textes sont plus simples à vérifier ou à modifier manuellement, ils posent moins de problèmes de portabilité. Ils sont plus simple à maintenir et à faire évoluer en fonction des besoins.

[modifier] Codages textes

Définir un codage textuel nécessite de choisir un protocole pour le séparateur de champs, l'échappement du caractère utilisé comme séparateur de champ, l'encodage des données binaires (par exemple uuencode, base64 ou échappement des caractères non ASCII), l'échappement du caractère d'échappement...

Il est donc relativement courant d'utiliser un dérivé du format XML. C'est le cas par exemple des protocoles de sérialisation au format texte SOAP et XML-RPC.

[modifier] Codages binaires

L'une des contraintes des codages binaires est la portabilité. Par exemple une machine utilisant un autre modèle de processeur que l'ordinateur d'origine doit pouvoir déserialiser un bloc de données, en prenant en compte les problème d'alignement de données ou d'endianness. C'est pourquoi, même si l'objet ne comporte pas de pointeurs, la simple copie de l'empreinte mémoire d'un objet n'est généralement pas une solution acceptable.

Il faut donc ici aussi utiliser des encodages conventionnels. Il est assez courant d'utiliser les conventions suivantes: pas d'alignement; encodage du types C short sur 2 octets, int et long sur 4 octets et long long sur 8 octets, tous au format big-endian. Les nombre en virgule flottante utilisent la norme IEEE 754, sur 4 octets pour les float et 8 octets pour les double.

[modifier] Sérialisation d'un objet atomique

Un objet atomique est un objet qui ne comporte aucune référence vers d'autres objets.

[modifier] Type de l'objet

Selon les possibilités du langage, la réanimation pourra utiliser un mécanisme de métaclasse apporté par le langage, ou une fabrique spécifique. Dans tous les cas, il est nécessaire de conserver les informations qui permettront de sélectionner le type d'objet à créer.

Si le nombre de types d'objets à sérialiser est connu à l'avance, les informations de type peuvent être codées de manière très compactes (Par exemple, sur un simple octet si celles-ci n'excède pas 256).

Sinon, il sera nécessaire d'utiliser des conventions, comme par exemple celle des packages du langage Java. Ces noms conventionnels étant généralement volumineux, il pourra être nécessaire de prévoir un mécanisme d'alias pour éviter les répétitions lors du traitement de plusieurs objets du même type.

Il est aussi possible de transmettre directement le code implémentant le type encodé. C'est la cas par exemple du module marshal de la bibliothèque standard du langage python, et c'est un mécanisme qui est plus généralement supporté par tous les langages interprétés supportant la mise en cache de leur byte code.

[modifier] Données

Chaque type de donnée est responsable de l'archivage et de la restauration de ses données membres. Pour les types composites, il s'agit de sérialiser chacun des champs dans un ordre prédéfini.

[modifier] Types hiérarchiques

En programmation orientée objet, il est nécessaire de traiter les données gérées par le type de base avant de d'archiver les données du type dérivé.

[modifier] Parcours du graphe d'objet

C'est une problématique qui est assez commune et que l'on retrouve par exemple quand on cherche à implémenter un clonage, ou un ramasse-miettes...

Des algorithmes plus ou moins performants peuvent être choisis suivant les à-priori que l'on peut faire sur la topologie du graphe:

  • arbre
  • graphe uniquement connecté aux feuilles
  • graphe quelconque


[modifier] Parcours manuel

Dans le cas général il est nécessaire de mémoriser les objets parcourus pour détecter les cycles.

Ce n'est pas une bonne idée d'utiliser les objets eux même pour pointer leur statut visité:

  • la méthode de sérialisaton se met à muter les objets
  • cela pose des problème de réentrance

Il est préférable d'utiliser une table de hashage (adresse de l'objet, compteur) qui sera par ailleurs utilisée pour implémenter la mutation de pointeur. Il faut alors veiller à retenir chaque objet pour éviter les collisions d'adresses avec de nouveaux objets.

La mutation de pointeurs est importante pour garantir que les références multiples vers un objet sont correctement sérialisées:

Avant sérialisation
Image:serialize1.svg
deux référence vers l'objet D
Après desérialisation
Image:serialize2.svg
deux instances de l'objet D

[modifier] Parcours par introspection

Les langages qui supportent l'introspection peuvent fournir un mécanisme de sérialisation par défaut.

[modifier] Désérialisation

La désérialisation pose également un certain nombre de problèmes comme la réanimation d'objet non mutable. Les objets ne peuvent pas être utilisés pendant la désérialisation

La désérialisation pose aussi des problèmes de sûreté du typage.

[modifier] Sécurité

La désérialisation nécessite l'interprétation de données qui peuvent venir d'une source qui est hors de contrôle. La sérialisation peut aussi entrainer l'exposititon de données privées.

[modifier] Gestion des versions

Il est souvent nécessaire de garantir une compatibilité ascendante ou descendante, c'est à dire la possibilité de relire ses données avec une nouvelle version du logiciel ou de permettre a une ancienne version du logiciel de lire des données créées à partir d'une version plus récente. Cela nécessite d'une part un mode de versionnage qui permet de connaître les versions compatibles et un moyen pour les versions les plus anciennes d'ignorer les données qu'elle ne savent pas interpréter.

[modifier] Alternatives

La sérialisation est un mécanisme de codage atomique: il n'est pas destiné à permettre d'accéder à un fragment des données sans avoir tout décodé.

Il existe des mécanismes comme NSKeyedArchiver de la bibliothèque Cocoa qui permet une réanimation partielle des objets. Il se rapprochent des système de base de données

Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2006 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Sub-domains

CDRoms - Magnatune - Librivox - Liber Liber - Encyclopaedia Britannica - Project Gutenberg - Wikipedia 2008 - Wikipedia 2007 - Wikipedia 2006 -

Other Domains

https://www.classicistranieri.it - https://www.ebooksgratis.com - https://www.gutenbergaustralia.com - https://www.englishwikipedia.com - https://www.wikipediazim.com - https://www.wikisourcezim.com - https://www.projectgutenberg.net - https://www.projectgutenberg.es - https://www.radioascolto.com - https://www.debitoformtivo.it - https://www.wikipediaforschools.org - https://www.projectgutenbergzim.com