Tout sur la sérialisation dans Visual Basic

La sérialisation est le processus de conversion d'un objet en une séquence linéaire de octets appelé "flux d'octets". La désérialisation inverse simplement le processus. Mais pourquoi voudriez-vous convertir un objet en un flux d'octets?

La raison principale est que vous pouvez déplacer l'objet. Considérez les possibilités. Puisque "tout est un objet" dans .NET, vous pouvez sérialiser n'importe quoi et l'enregistrer dans un fichier. Vous pouvez donc sérialiser des images, des fichiers de données, l'état actuel d'un module de programme («état» est comme un instantané de votre programme à un moment donné afin que vous puissiez suspendre temporairement l'exécution et recommencer plus tard)... tout ce que vous devez faire.

Vous pouvez également stocker ces objets sur disque dans des fichiers, les envoyer sur le Web, les transmettre à un autre programme, conserver une copie de sauvegarde pour des raisons de sécurité. Les possibilités sont littéralement infinies.

C'est pourquoi la sérialisation est un processus clé dans .NET et

instagram viewer
Visual Basic. Vous trouverez ci-dessous une section sur la sérialisation personnalisée en implémentant le ISérialisable interface et codage d'un Nouveau et un GetObjectDatasous-programme.

Comme premier exemple de sérialisation, faisons l'un des programmes les plus simples, mais aussi l'un des plus utiles: la sérialisation des données, puis la désérialisation des données en classe simple vers et depuis un fichier. Dans cet exemple, les données sont non seulement sérialisées, mais la structure des données est également enregistrée. La structure ici est déclarée dans un module pour garder les choses... bien... structuré.

Module SerializeParms
ParmExample de classe publique
Parm1Name public As String = "Nom Parm1"
Public Parm1Value As Integer = 12345
Parm2Name public en tant que chaîne
Public Parm2Value As Decimal
Fin de classe
Module de fin

Ensuite, des valeurs individuelles peuvent être enregistrées dans un fichier comme celui-ci:

Système d'importation. Durée. Sérialisation. Formateurs. Binaire
Système d'importation. IO
Formule de classe publique1
Sous privé mySerialize_Click (_
Expéditeur ByVal en tant que système. Objet, _
ByVal e As System. EventArgs) _
Gère mySerialize. Cliquez sur
Dim ParmData comme nouveau ParmExample
ParmData. Parm2Name = "Nom Parm2"
ParmData. Parm2Value = 54321.12345
Dim s As New FileStream ("ParmInfo", FileMode. Créer)
Dim f comme nouveau BinaryFormatter
F. Sérialiser (s, ParmData)
s. Fermer()
End Sub
Fin de classe

Et ces mêmes valeurs peuvent être récupérées comme ceci:

Système d'importation. Durée. Sérialisation. Formateurs. Binaire
Système d'importation. IO
Formule de classe publique1
Sous privé myDeserialize_Click (_
Expéditeur ByVal en tant que système. Objet, _
ByVal e As System. EventArgs) _
Gère myDeserialize. Cliquez sur
Dim s = New FileStream ("ParmInfo", FileMode. Ouvert)
Dim f comme nouveau BinaryFormatter
Dim RestoredParms comme nouveau ParmExample
RestoredParms = f. Désérialiser (s)
s. Fermer()
Console. WriteLine (RestoredParms. Parm1Name)
Console. WriteLine (RestoredParms. Parm1Value)
Console. WriteLine (RestoredParms. Parm2Name)
Console. WriteLine (RestoredParms. Parm2Value)
End Sub
Fin de classe

UNE Structure ou une collection (comme un Liste des tableaux) Plutôt qu'un Classe pourrait également être sérialisé en un fichier de la même manière.

Maintenant que nous avons passé en revue le processus de sérialisation de base, regardons les détails spécifiques qui font partie du processus sur la page suivante.

L'une des premières choses que vous devriez remarquer à propos de cet exemple est la attribut dans le Classe. Les attributs sont juste plus d'informations que vous pouvez fournir à VB.NET sur un objet et elles sont utilisées pour beaucoup de choses différentes. L'attribut dans ce code indique à VB.NET d'ajouter du code supplémentaire afin que plus tard, tout dans cette classe puisse être sérialisé.

S'il y a des éléments spécifiques dans la classe que vous ne le fais pas voulez être sérialisé, vous pouvez utiliser le attribut pour les exclure:

Public Parm3Value As String = "Peu importe"

Dans l'exemple, notez que Sérialiser et Désérialiser sont des méthodes de BinaryFormatter objet (F dans cet exemple).

F. Sérialiser (s, ParmData)

Cet objet prend la FileStream objet et l'objet à sérialiser en tant que paramètres. Nous verrons que VB.NET propose un autre objet qui permet au résultat d'être exprimé en XML.

Et une dernière note, si votre objet comprend d'autres objets subordonnés, ils seront également sérialisés! Mais depuis tout objets sérialisés doit être marqué avec le , tous ces objets enfants doivent également être marqués de cette façon.

Juste pour être complètement clair sur ce qui se passe dans votre programme, vous voudrez peut-être afficher le fichier nommé ParmData dans le Bloc-notes pour voir à quoi ressemblent les données sérialisées. (Si vous avez suivi ce code, il devrait se trouver dans le poubelle. Déboguer dans votre projet.) Puisqu'il s'agit d'un fichier binaire, la plupart du contenu n'est pas du texte lisible, mais vous devriez pouvoir voir toutes les chaînes de votre fichier sérialisé. Nous ferons une version XML ensuite et vous voudrez peut-être comparer les deux juste pour être conscient de la différence.

La sérialisation en XML au lieu d'un fichier binaire nécessite très peu de modifications. XML n'est pas aussi rapide et ne peut pas capturer certaines informations sur les objets, mais il est beaucoup plus flexible. XML peut être utilisé par à peu près n'importe quelle autre technologie logicielle dans le monde aujourd'hui. Si vous voulez être sûr que vos structures de fichiers ne vous «lient pas» à Microsoft, c'est une bonne option à examiner. Microsoft met l'accent sur "LINQ to XML" pour créer des fichiers de données XML dans leur dernière technologie, mais de nombreuses personnes préfèrent toujours cette méthode.

Le «X» dans XML signifie eXtensible. Dans notre exemple XML, nous allons utiliser l'une de ces extensions de XML, une technologie appelée SAVON. Auparavant, cela signifiait "Simple Object Access Protocol" mais maintenant ce n'est qu'un nom. (SOAP a été tellement mis à niveau que le nom d'origine ne correspond plus si bien.)

La principale chose que nous devons changer dans nos sous-programmes est la déclation du formateur de sérialisation. Cela doit être changé à la fois dans le sous-programme qui sérialise l'objet et celui qui le désérialise à nouveau. Pour la configuration par défaut, cela implique trois modifications à votre programme. Tout d'abord, vous devez ajouter une référence au projet. Cliquez avec le bouton droit sur le projet et sélectionnez Ajouter une référence .... Assure-toi ...

Système. Durée. Sérialisation. Formateurs. Savon

... a été ajouté au projet.

Modifiez ensuite les deux instructions dans le programme qui y fait référence.

Système d'importation. Durée. Sérialisation. Formateurs. Savon
Dim f comme nouveau SoapFormatter

Cette fois, si vous vérifiez la même chose ParmData fichier dans le Bloc-notes, vous verrez que le tout est en texte XML lisible tel que ...

Nom Parm1
12345
Nom Parm2
54321.12345

Il y a également beaucoup de XML supplémentaires qui sont nécessaires pour la norme SOAP dans le fichier. Si vous voulez vérifier ce que attribut, vous pouvez ajouter une variable avec cet attribut et regarder le fichier pour vérifier qu'il n'est pas inclus.

L'exemple que nous venons de coder n'a sérialisé que les données, mais supposons que vous ayez besoin de contrôler la façon dont les données sont sérialisées. VB.NET peut aussi faire ça!

Pour ce faire, vous devez approfondir un peu le concept de sérialisation. VB.NET a un nouvel objet pour vous aider ici: SerializationInfo. Bien que vous ayez la possibilité de coder un comportement de sérialisation personnalisé, cela entraîne un coût de codage supplémentaire.

Les bases supplémentaire le code est montré ci-dessous. Rappelez-vous, cette classe est utilisée à la place de ParmExample classe indiquée dans l'exemple précédent. Ce n'est pas un exemple complet. Le but est de vous montrer le nouveau code qui est nécessaire pour la sérialisation personnalisée.

Système d'importation. Durée. Sérialisation
_
Classe publique CustomSerialization
Implémente ISerializable
'données à sérialiser ici
'Public SerializedVariable as Type
Public Sub New ()
'constructeur par défaut lorsque la classe
'est créé - le code personnalisé peut être
'ajouté ici aussi
End Sub
Public Sub New (_
ByVal info As SerializationInfo, _
Contexte ByVal comme StreamingContext)
'initialisez vos variables de programme à partir de
'un magasin de données sérialisé
End Sub
Sous-public GetObjectData (_
ByVal info As SerializationInfo, _
Contexte ByVal comme StreamingContext) _
Implémente ISerializable. GetObjectData
'mettre à jour le magasin de données sérialisé
'des variables de programme
End Sub
Fin de classe

L'idée est que maintenant vous pouvez (et, en fait, vous doit) effectuer la mise à jour et la lecture des données dans le magasin de données sérialisées du Nouveau et GetObjectData sous-programmes. Vous devez également inclure un générique Nouveau constructeur (pas de liste de paramètres) car vous implémentez une interface.

La classe aura normalement des propriétés formelles et des méthodes codées également ...

'Propriété générique
Private newPropertyValue As String
Propriété publique NewProperty () As String
Avoir
Renvoyer newPropertyValue
Fin Get
Set (valeur ByVal As String)
newPropertyValue = valeur
Ensemble d'extrémité
Propriété de fin
«Méthode générique
Public Sub MyMethod ()
'code de méthode
End Sub

La classe sérialisée résultante peut créer des valeurs uniques dans le fichier en fonction du code que vous fournissez. Par exemple, une classe immobilière peut mettre à jour la valeur et l'adresse d'une maison, mais la classe sérialise également une classification de marché calculée.

le Nouveau sous-programme ressemblera à ceci:

Public Sub New (_
ByVal info As SerializationInfo, _
Contexte ByVal comme StreamingContext)
'initialisez vos variables de programme à partir de
'un magasin de données sérialisé
Parm1Name = info. GetString ("a")
Parm1Value = info. GetInt32 ("b")
«Le nouveau sous-marin continue ...

Quand Désérialiser est appelé sur un BinaryFormatter objet, ce sous est exécuté et un SerializationInfo l'objet est passé au Nouveau sous-programme. New peut alors faire tout ce qui est nécessaire avec les valeurs de données sérialisées. Par exemple ...

MsgBox ("Ceci est Parm1Value Times Pi:" _
& (Parm1Value * Math. PI) .ToString)

L'inverse se produit lorsque Sérialiser est appelé, mais le BinaryFormatter appels d'objets GetObjectData au lieu.

Sous-public GetObjectData (_
ByVal info As SerializationInfo, _
Contexte ByVal comme StreamingContext) _
Implémente ISerializable. GetObjectData
'mettre à jour le magasin de données sérialisé
'des variables de programme
Si Parm2Name = "Test" Alors
Info. AddValue ("a", "Ceci est un test.")
Autre
Info. AddValue ("a", "Pas de test cette fois.")
Fin si
Info. AddValue ("b", 2)

Notez que les données sont ajoutées au fichier sérialisé sous forme de paires nom / valeur.

Beaucoup de pages Web que j'ai trouvées en écrivant cet article ne semblent pas avoir de code de travail réel. On se demande si l'auteur a effectivement exécuté du code avant d'écrire parfois l'article.