WRITE
WRITE [ # flux , ] Expression AS TypeDonnée
WRITE [ # flux , ] Chaîne [ , Longueur ]
WRITE [ # flux , ] Pointeur [ , Longueur ]
Écriture d’un type de données spécifique.
La première syntaxe écrit une expression dans le flux
flux en utilisant sa représentation binaire.
Si le flux n’est pas spécifié, c’est la sortie standard qui est utilisée.
À l’écriture d’une chaîne, la longueur de la chaîne est envoyée avant son contenu.
Voir
Représentation binaire des données pour plus d’information.
Depuis 3.15
Si la propriété
Stream.NullTerminatedString est définie, alors la longueur de la chaîne n'est pas écrite, mais un octet nul est écrit après la fin de la chaîne.
Le type de donnée de
Expression peut être l’un des suivants :
NULL,
Boolean,
Byte,
Short,
Integer,
Long,
Pointer,
Single,
Float,
Date,
String,
Variant, tout
tableau , toute
Collection ou structure.
Si
Expression est une collection, un tableau ou une structure, son contenu est alors écrit récursivement.
Lors de l’écriture d’une structure, le type de structure doit être spécifié comme
TypeDonnée.
Si un type de donnée non géré est écrit, ou si une référence circulaire est détectée, une erreur est levée.
cette instruction suit l’ordre des octets du flux pour écrire les données.
Écriture du contenu d’une chaîne.
La seconde syntaxe écrit
Longueur octets de la chaîne
Chaîne vers le flux spécifié.
Si le flux n’est pas spécifié, c’est la sortie standard qui est utilisée.
Si
Longueur n’est pas spécifié, la longueur de
Chaîne est utilisée.
Écriture du contenu de mémoire
La troisième syntaxe écrit
Longueur octets du
Pointeur de l'adresse mémoire vers le flux spécifié.
Si le flux n’est pas spécifié, c’est la sortie standard qui est utilisée.
Longueur doit être spécifié, sinon rien n'est effectué.
Écriture d'un objet
Depuis 3.15
Tout objet peut être sérialisé, à condition que sa classe implémente la méthode spéciale
_write.
Vous écrivez l'objet en utilisant une des syntaxex suivantes :
WRITE #Stream, Object As <ObjectClass>
WRITE #Stream, Object As Object
WRITE #Stream, Object As Variant
Si vous lisez l'objet ultérieurement en utilisant
'As Variant'
ou
'As Object'
, vous devez l'écrire en utilisant
'As Variant'
ou
'As Object'
.
Car dans ce cas, le nom de classe de l'objet nécessaire est écrit dans le flux. Sinon, l'instruction
READ ne dispose pas du nom de classe nécessaire à l'instanciation de l'objet.
Écriture d'un même objet plusieurs fois
Depuis 3.17
Avant la version 3.17, les objets écrits plusieurs fois sont dupliqués.
Depuis la version 3.17, ils ne sont plus dupliqués. Une fois qu'un objet a été sérialisé, il est écrit sous forme d'une référence à cinq octets à chaque fois qu'il est réécrit.
De même, lors de la lecture, l'objet est créé une fois, et partagé entre toutes les autres références.
Compatibilité avec Gambas 2
ATTENTION!
WRITE #Flux, Expression
écrit la forme binaire de
Expression en Gambas 2.0.
En Gambas 3.0
Expression est écrite comme une chaîne.
Vous
DEVEZ donc vérifier toutes vos instructions
WRITE quand vous convertissez un projet Gambas de la version 2.0 vers 3.0, et spécifier
AS TypeDonnée
quand c’est nécessaire.
Par défaut, le compilateur gère l’ancienne syntaxe
READ, et l’ancienne syntaxe WRITE quand elle est compatible.
Si vous voulez déterminer à quels endroits il vous faut réécrire votre syntaxe
READ / WRITE, vous pouvez compiler votre projet à la main avec l'option "--no-old-read-write-syntax". Alors l’argument
Longueur de WRITE devient obligatoire quand la deuxième syntaxe est utilisée.
L'utilisation d'un
pointeur comme flux n'est plus possible. A la place, créez un flux mémoire avec l'instruction
MEMORY .
Voir aussi