ONLINE HELP
 WINDEVWEBDEV AND WINDEV MOBILE

Help / WLanguage / Managing databases / HFSQL / Managing 3-tier architecture / WLanguage functions
  • 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
  • Limites
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaEtats et RequêtesCode Utilisateur (MCU)
WEBDEV
WindowsLinuxPHPWEBDEV - Code Navigateur
WINDEV Mobile
AndroidWidget AndroidiPhone/iPadWidget IOSApple WatchMac CatalystUniversal Windows 10 App
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.
// 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.
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, ...).
WEBDEV - Code NavigateurAndroidWidget AndroidApple 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 NavigateurJavaPHP 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 psdXMLAbrégé est disponible, cependant les éléments WLangage (variants, tableaux, classes dérivées, ...) ne seront pas les mêmes que ceux d'origine.
WEBDEV - Code NavigateurAndroidWidget AndroidJavaPHP Ce mode de sérialisation n'est pas disponible.
<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 serialisation/désrialisation 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>

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.
  • 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.
  • Seule la sérialisation de type JSON est disponible pour les variables de type Enregistrement. Aucune désérialisation n'est disponible.
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
Minimum version required
  • Version 10
Comments
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 Jun. 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 Jun. 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 May 2021

Last update: 06/29/2023

Send a report | Local help