DOCUMENTATION EN LIGNE
DE WINDEVWEBDEV ET WINDEV MOBILE

Aide / WLangage / Gestion des bases de données / HFSQL / Gestion du 3tiers / Fonctions WLangage
  • Désérialisation
  • Changement de comportement en version 10 : génération d'une sérialisation XML pour les Mobiles
  • Rapidité
  • Sérialisation des membres de classes et de structures
  • Nom de sérialisation des classes
  • Options disponibles pour la sérialisation des tableaux en XML
  • Limites
WINDEV
WindowsLinuxJavaEtats et RequêtesCode Utilisateur (MCU)
WEBDEV
WindowsLinuxPHPWEBDEV - Code Navigateur
WINDEV Mobile
AndroidWidget AndroidiPhone/iPadWidget IOSApple WatchMac Catalyst
Autres
Procédures stockées
Transforme les éléments suivants dans un format spécifique :
  • une structure (et ses sous-éléments).
  • une classe (et ses sous-éléments).
  • un tableau (y compris les tableaux associatifs).
  • une file.
  • une pile.
  • une liste.
  • une variable d'un type avancé (par exemple gglAgenda).
Les formats disponibles sont XML, binaire et JSON. Il sera ensuite possible de récupérer le format initial grâce à la fonction Désérialise.
Nouveauté 2025
WEBDEV - Code Navigateur Il est désormais possible de sérialiser une chaîne de caractères contenant les données d'une file ou d'une pile.
Nouveauté Abonnement
WEBDEV - Code Navigateur Il est désormais possible de désérialiser une chaîne de caractères contenant les données d'une liste. Attention : Cette fonctionnalité est disponible uniquement dans la version Abonnement à partir de WINDEV Suite 2025 Update 4.
Pour plus de détails, consultez Utiliser les nouveautés de WINDEV Suite 2025 spécifiques à l'abonnement.
// Cet exemple montre l'utilisation des fonctions Sérialise/Désérialise
// avec une variable de type Tableau. 
// Ces fonctions peuvent utiliser tous les types de variables WLangage.

MonTableau est un tableau de chaînes
bufRésultat est un Buffer

// Ajoute des éléments dans le tableau
Ajoute(MonTableau, "WINDEV")
Ajoute(MonTableau, "WEBDEV")
Ajoute(MonTableau, "WINDEV MOBILE")

// Sérialisation du tableau dans le buffer en JSON
// => Sauvegarde du tableau et de tout son contenu dans une chaîne JSON
Sérialise(MonTableau, bufRésultat, psdJSON)

// Désérialisation du buffer JSON
// => Reconstruction du tableau WLangage à partir de la chaîne JSON
MonTableauReconstruit est un tableau de chaînes
Désérialise(MonTableauReconstruit, bufRésultat, psdJSON)
Syntaxe
Sérialise(<Variable> , <Buffer> , <Paramètres> [, <Nom de la racine>])
<Variable> : Type de la variable
Variable à sérialiser. Cette variable est de type structure, classe, tableau, file, liste ou pile.
<Buffer> : Chaîne de caractères Ansi ou buffer
Variable qui contient le résultat de la sérialisation.
WEBDEV - Code Navigateur Seules les variables de type chaîne de caractères sont disponibles.
<Paramètres> : Constante de type Entier
Type de sérialisation :
psdBinaireSérialisation binaire.
Nouveauté Abonnement
Il est possible de réaliser une sérialisation binaire d'un membre ou d'une variable JSON.
Attention : Cette fonctionnalité est disponible uniquement dans la version Abonnement à partir de WINDEV Suite 2025 Update 2.
Pour plus de détails, consultez Utiliser les nouveautés de WINDEV Suite 2025 spécifiques à l'abonnement.
WEBDEV - Code NavigateurAndroidWidget AndroidJavaPHP La désérialisation binaire n'est pas disponible.
psdBinaireFormat16Sérialisation binaire au format compatible avec la version 16.
Ce format doit être utilisé si une application en version 17 (ou supérieure) doit fournir des données à une application en version 16 ou inférieure.
Ce format ne doit pas être utilisé en mode Unicode.
WEBDEV - Code NavigateurAndroidWidget AndroidJavaPHP La désérialisation binaire n'est pas disponible.
psdJSONSérialisation au format JSON.
L'encodage utilisé correspond au standard JSON :
  • l'utilisation d'un encodage en ASCII 7 bits, soit les 128 premiers caractères, les caractères non accentués,
  • l'utilisation d'un encodage JSON des autres caractères : "\u" suivi du code du caractère en hexadécimal sur 4. Exemple : pour "é" (code ASCII 233, code hexadécimal E9), l'encodage correspond à "\u00E9".
Java La désérialisation au format JSON n'est pas disponible.
psdMinifiéAttention : Cette constante doit être combinée à la constante psdJSON. Dans les autres cas, elle n'est pas prise en compte.
L'encodage utilisé correspond au standard JSON. Cette constante permet de générer un JSON en supprimant les espaces inutiles (retours à la ligne, caractères d'espacement, etc.).
WEBDEV - Code NavigateurApple WatchJavaPHP Cette constante n'est pas disponible.

psdMiseEnFormeSérialisation au format JSON ou XML avec retours à la ligne et indentation.
L'encodage utilisé correspond au standard JSON ou XML.
Attention : Cette constante doit être combinée avec la constante psdJSON ou psdXML.
WEBDEV - Code NavigateurApple WatchJavaPHP La sérialisation au format JSON avec mise en forme n'est pas disponible.
psdXMLSérialisation XML avec référence aux sous-objets. Ce type de sérialisation permet d'utiliser le format XML comme moyen de stockage et d'échange entre des applications écrites en WLangage.
WEBDEV - Code Navigateur La sérialisation au format XML n'est pas disponible.
psdXMLAgrégéSérialisation XML avec agrégation directe des sous-objets. Ce type de sérialisation permet de générer rapidement un fichier XML dans un format classique, utilisé pour des échanges avec d'autres systèmes.
Remarque : Une désérialisation en mode psdXMLAgrégé est disponible, cependant les éléments WLangage (variants, tableaux, classes dérivées, etc.) ne seront pas les mêmes que ceux d'origine.
WEBDEV - Code NavigateurAndroidWidget AndroidJavaPHP Ce mode de sérialisation n'est pas disponible.
Nouveauté 2025
psdXMLTableauÉlémentsRépétés
Sérialisation XML permettant de gérer les tableaux sous forme répétée.
Attention : Cette constante doit être combinée avec la constante psdXMLAgrégé. Pour plus de détails, consultez les exemples de sérialisation des tableaux.
WEBDEV - Code NavigateurAndroidWidget AndroidJavaPHP Ce mode de sérialisation n'est pas disponible.
Attention : Cette constante est disponible uniquement à partir de la version 2025 Update 1.
<Nom de la racine> : Chaîne de caractères
Nom de la racine du XML généré. Ce paramètre est pris en compte uniquement en mode psdXMLAgrégé.
Si ce paramètre n'est pas précisé, le nom de la racine est "DOCUMENT".
WEBDEV - Code Navigateur Ce paramètre n'est pas disponible.
Remarques

Désérialisation

La désérialisation d'un tableau, d'une pile, d'une liste ou d'une file supprime le contenu de cet élément.
S'il y a des membres en plus dans la structure ou dans la classe :
  • si on désérialise une structure ou une classe : les membres supplémentaires conservent leurs valeurs d'avant la désérialisation.
  • si on désérialise un tableau de structures ou de classes : les membres supplémentaires prennent la valeur par défaut du type du membre.
S'il y a des membres en plus dans le buffer sérialisé, ils ne sont pas pris en compte lors de la désérialisation.
Pour désérialiser un tableau dynamique sans type, il est nécessaire d'allouer préalablement ce tableau.
Pour désérialiser une classe ou une structure contenant un tableau dynamique sans type, il est nécessaire d'allouer préalablement ce tableau.
La désérialisation XML nécessite la librairie wd300xml.dll ou wp300xml.dll.
AndroidWidget AndroidJava Pour que le format de sérialisation soit compatible entre des applications WINDEV et des applications WINDEV Java, les noms des éléments sérialisés suivants ne doivent pas contenir des caractères spéciaux ou des caractères accentués :
  • classes,
  • tableaux de classes,
  • structures,
  • tableaux de structures.
AndroidWidget Android La sérialisation/désérialisation XML des variants n'est pas supportée.
WEBDEV - Code Navigateur Les noms des éléments sérialisés suivants ne doivent pas contenir des caractères spéciaux ou des caractères accentués :
  • classes,
  • tableaux de classes,
  • structures,
  • tableaux de structures.

Changement de comportement en version 10 : génération d'une sérialisation XML pour les Mobiles

Jusqu'à la version 100050, l'utilisation de la constante psdXML ne générait pas un fichier XML correct. Le format généré posait un problème essentiellement sur les postes Mobiles. Ce problème a été corrigé.
Un fichier XML créé avec une version supérieure à la version 100050 n'est pas lisible par un programme compilé avec une version antérieure. Pour conserver le fonctionnement de la version 100050, il suffit d'utiliser la constante psdXML_AncienFormat.

Rapidité

La sérialisation binaire est plus rapide que la sérialisation XML.

Sérialisation des membres de classes et de structures

Par défaut, tous les membres d'une classe ou d'une structure sont sérialisés.
Il est possible de gérer précisément la sérialisation de chaque membre :
  • en indiquant quel membre sera sérialisé lors de l'appel à la fonction Sérialise.
    Cette opération est possible sur tous les types de sérialisation (XML, JSON, binaire).
    WEBDEV - Code NavigateurPHP Fonctionnalité non disponible.
  • en changeant le nom du membre lors de la sérialisation par la fonction Sérialise.
    Cette opération n'est pas possible lors d'une sérialisation binaire.
    WEBDEV - Code NavigateurPHP Fonctionnalité non disponible.
Cette gestion de la sérialisation est réalisée en utilisant la syntaxe suivante :
  • Sérialisation ou non d'un membre  :
    <Nom du membre> est un <Type du membre> [, Sérialise = <Vrai / Faux>] [, xmlAttribut]
  • Sérialisation et changement du nom d'un membre :
    <Nom du membre> est un <Type du membre> [, Sérialise = <Nouveau nom>] [, xmlAttribut]
L'attribut d'extension "xmlAttribut" permet d'indiquer que le membre est créé en tant qu'attribut (et non balise). Cet attribut est pris en compte uniquement lors d'une sérialisation de type psdXMLAgrégé.
WEBDEV - Code NavigateurAndroidWidget AndroidJavaPHP L'attribut d'extension "xmlAttribut" n'est pas disponible.
Exemple pour une classe :
Cl est une Classe
	// Membre sérialisé
	MembreSérialisé est un entier 
	// Membre non sérialisé
	MembreNonSérialisé est une chaîne, sérialise = faux  
	// Membre renommé lors de la sérialisation
	MembreRenommé est un entier, sérialise = "NouveauNomMembre" 
FIN
Remarque : Pour ne pas sérialiser un membre de type tableau, il faut utiliser la syntaxe suivante :
t1 est un tableau <Sérialise = Faux> d'entier
t2 est un tableau <Sérialise = "<nom de sérialisation>"> d'entier

Nom de sérialisation des classes

L'attribut d'extension "Sérialise" est disponible sur les classes pour indiquer le nom de sérialisation.
La syntaxe utilisée est la suivante :
<Nom de la classe> est une Classe [, Sérialise = <Nouveau nom>]
WEBDEV - Code NavigateurPHP Fonctionnalité non disponible.
Exemple :
CTest est une Classe, sérialise = "Test"
	m_sNom est une chaîne, sérialise = "Nom"
	m_sPrenom est une chaîne, sérialise = "Prenom"
	m_sSuitePrenom est une chaîne, sérialise = "SuitePrenom"
FIN

sXML est un Buffer
 monTest est un CTest
 monTest.m_sNom = "Mon Nom"
 monTest.m_sPrenom = "Mon Prénom"
 monTest.m_sSuitePrenom = "Mon Prénom Mon Prénom"
Sérialise(monTest, sXML, psdXMLAgrégé)


// Contenu de sXML où l'on retrouve bien les noms de la sérialisation :
// <?xml version="1.0" encoding="UTF-8"?>
// <Test>
//  <Nom>Mon Nom</Nom>
//  <Prenom>Mon Prénom</Prenom>
//  <SuitePrenom>Mon Prénom Mon Prénom</SuitePrenom>
// </Test>

Options disponibles pour la sérialisation des tableaux en XML

  • Déclaration du tableau :
    LaStructure est une Structure
    	LeTableau est un tableau d'entiers
    FIN
    
    la_variable est LaStructure
    la_variable.LeTableau = [1, 2, 3]
  • Sérialisation avec la constante psdXML :
    Sérialise(la_variable, le_XML, psdXML)
    Résultat :
    <?xml version="1.0"?>
    <DOCUMENT xmlns:SOAP_ENC="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <LaStructure id="id0">
    <LeTableau SOAP_ENC:arrayType="LeTableau[3]">
    <item>1</item>
    <item>2</item>
    <item>3</item>
    </LeTableau>
    </LaStructure>
    </DOCUMENT>
  • Sérialisation avec la constante psdXMLAgrégé :
    Sérialise(la_variable, le_XML_agrégé, psdXMLAgrégé)
    Résultat :
    <?xml version="1.0"?>
    <LaStructure>
    <LeTableau>
    <item>1</item>
    <item>2</item>
    <item>3</item>
    </LeTableau>
    </LaStructure>
  • Nouveauté 2025
    Sérialisation avec les constantes psdXMLAgrégé et psdXMLTableauÉlémentsRépétés :
    Sérialise(la_variable, le_XML_avec_éléments_tableau_répétés, 
    psdXMLAgrégé + psdXMLTableauÉlémentsRépétés)
    Résultat :
    <?xml version="1.0"?>
    <LaStructure>
    <LeTableau>1</LeTableau>
    <LeTableau>2</LeTableau>
    <LeTableau>3</LeTableau>
    </LaStructure>
    Attention : Cette syntaxe est disponible uniquement à partir de la version 2025 Update 1.

Limites

  • Les tableaux fixes et les tableaux associatifs de structures locales ne peuvent pas être sérialisés.
  • Les membres globaux des classes ne sont pas sérialisés.
  • La sérialisation/désérialisation XML d'un tableau de structures avec un membre chaîne contenant un "\0" ou Caract(0) renvoie l'erreur "Format de sérialisation incorrect". Il est nécessaire de faire une sérialisation/désérialisation binaire dans ce cas.
  • Il n'est pas possible de sérialiser/désérialiser un tableau de classes ou de structures si cette classe ou cette structure contient un tableau dynamique sans type. Il est nécessaire d'utiliser un tableau dynamique typé dans cette classe ou cette structure.
  • Pour sérialiser/désérialiser une classe, il est nécessaire d'avoir un constructeur avec 0 paramètre.
  • Seule la sérialisation de type JSON est disponible pour les variables de type Enregistrement. Aucune désérialisation n'est disponible.
  • Piles, files, listes :
    • La sérialisation JSON des piles, files, listes n'est pas possible.
    • AndroidWidget AndroidJava Il n'est pas possible de sérialiser/désérialiser des variables de type File, Pile ou Liste.
    • WEBDEV - Code Navigateur Il n'est pas possible de sérialiser/désérialiser des variables de type Liste.
      Nouveauté Abonnement
      WEBDEV - Code Navigateur Il est désormais possible de sérialiser/désérialiser des variables de type Liste.
      Attention : Cette fonctionnalité est disponible uniquement dans la version Abonnement à partir de WINDEV Suite 2025 Update 4.
      Pour plus de détails, consultez Utiliser les nouveautés de WINDEV Suite 2025 spécifiques à l'abonnement.
Liste des exemples associés :
Les fonctions Sérialise/Désérialise Exemples unitaires (WEBDEV) : Les fonctions Sérialise/Désérialise
[ + ] Utilisation des fonctions WLangage Sérialise et Désérialise.
La sérialisation consiste à sauvegarder une variable, un objet, une structure, un tableau ou tout autre élément dans un buffer.
Ce buffer peut ensuite être sauvegardé sur disque ou envoyé par socket. Cela permet la persistance des objets.
La fonction Désérialise permet de reconstruire un objet, un tableau ou une structure à partir d'un buffer.
Les fonctions Sérialise/Désérialise Exemples unitaires (WINDEV) : Les fonctions Sérialise/Désérialise
[ + ] Utilisation des fonctions WLangage Sérialise et Désérialise.
La sérialisation consiste à sauvegarder une variable, un objet, une structure, un tableau ou tout autre élément dans un buffer. Ce buffer peut être ensuite sauvegardé sur disque ou envoyé par socket. Cela permet la persistance des objets.
La fonction Désérialise permet de reconstruire un objet, un tableau ou une structure à partir d'un buffer.
Classification Métier / UI : Code neutre
Composante : wd300vm.dll
Version minimum requise
  • Version 10
Documentation également disponible pour…
Commentaires
Lenteur de la fonction
-si l'objet à sérialiser contient 60 000 sous objets il sérialisera en 2 secondes
-si l'objet contient 180 000 sous objets il sérialisera en 104 secondes

Donc si on multiplie par 3 la quantité d'objets, on multiplie par 52 le temps de traitement. Ce qui me parait bien anormal quand même et c'est très handicapant, donc faites attention si vous voulez utiliser cette fonction sur de gros objets.
kunnskap
07 jan. 2024
WM26
Problème existe également en v26.

Sérialiser une structure ou un tableau associatif génère une erreur (La sérialisation JSON n'autorise pas les éléments de types tableau associatif (ou buffer si variant))

(Même erreur JSON si le type est psdxml d'ailleurs)
les 2 codes suivant fonctionnent correctement sur l'émulateur android avec le même target (testé avec samsung a10, et 1+ 6)
code test :

ta est un tableau associatif de chaînes
ta["test"]="toto"
bData est un Buffer
Sérialise(ta, bData, psdJSON) > La sérialisation JSON n'autorise pas les éléments de types 'tableau associatif'

-------

Msg est une stMsg (structure de 4 chaines)
bData est un Buffer
Sérialise(Msg, bData, psdJSON) > La sérialisation JSON n'autorise pas les éléments de types 'Buffer'
testé également en copiant la st dans un variant, même erreur
Nicolas INNOCENT
14 juin 2021
sérialisation ok mais désérialisation ko
Je confirme à moitié : la structure peut être sérialisée, mais la désérialisation plante.
Guillaume HUOT
02 juin 2021
[WM 25] Sérialise / Désérialise sur Android 9
Bonjour,

Une structure contenant des tableaux associatifs ne peux pas être sérialise ni désérialise avec l'option psdJSON

Cela fonctionne parfaitement en windev et même en débug mais une fois compilé le plantage est assuré

Le standard JSON gère parfaitement les tableaux associatifs.
Gurdarr
27 mai 2021

Dernière modification : 26/08/2025

Signaler une erreur ou faire une suggestion | Aide en ligne locale