La sauvegarde d'objets La sérialisation, c'est quoi ? Vous vous souvenez du cyc
La sauvegarde d'objets La sérialisation, c'est quoi ? Vous vous souvenez du cycle de vie d'une variable normale, dés que la boucle, fonction, classe dans laquelle elle a été crée est terminée, la variable est détruite et libérée de la mémoire. Les données qu'elle contient sont donc perdues. Vous avez dus vous douter que le même principe s'appliquait pour les objets. Et là ce n'est pas une simple valeur de variable qui est perdue mais toutes les variables que l'objet contenant (des attributs). Pour sauvegarder notre variable pour une utilisation ultérieure (un autre lancement du programme), nous avons vus comment stocker cette variable dans un fichier. Les integers, strings, dates, bref les variables basiques sont facilement stockables mais les objets le sont plus difficilement. Je vais créer une classe basique contenant des informations concrètes. Le projet que j'ai crée est de type console car l'interface graphique est superflue pour le moment. Code : VB.NET - Sélectionner 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Public Class Film Public Titre As String Public Annee As Integer Public Desciption As String Sub New() End Sub Sub New(ByVal TitreFilm As String, ByVal AnneeFilm As Integer, ByVal DescriptionFilm As String) Titre = TitreFilm Annee = AnneeFilm Desciption = DescriptionFilm End Sub End Class Ma classe s'appelle Film, elle va contenir des informations pour créer un objet Film auquel on spécifiera son nom, son année de sortie et une petite description. Cette classe est très basique, seulement trois attributs. Mais si je veux la sauvegarder il va déjà falloir écrire 3 variables différentes dans un fichier. Donc imaginez avec plusieurs dizaines d'informations (attributs). Avec la sérialisation (le stockage d'objet) on va pouvoir facilement écrire tous les attributs d'un objet dans un fichier. Ce fichier sera automatiquement formaté. Ce formatage va dépendre de la méthode de sérialisation utilisée. Il existe donc deux méthodes. La méthode binaire, elle permet la sauvegarde des attributs Publics et Privés tout en incluant également le nom de la classe dans le fichier. La seconde méthode, la sérialisation XML est très utile car le format soap (le type de formatage d'un fichier XML) est très répandu, pour communiquer via des Webservices et en général sur l'internet. Ses inconvénients sont que les attributs privés ne sont pas pris en compte et les types des attributs ne sont enregistrés nulle part. Commençons avec la sérialisation Binaire : La sérialisation binaire. Pour commencer je modifie notre classe Film pour spécifier au programme qu'il peut la sérialiser grâce à <Serializable()> inscrit dans sa déclaration : Code : VB.NET - Sélectionner 1 2 3 4 5 6 7 8 9 <Serializable()> Public Class Film Public Titre As String Public Annee As Integer Public Desciption As String Sub New() 10 11 12 13 14 15 16 17 18 End Sub Sub New(ByVal TitreFilm As String, ByVal AnneeFilm As Integer, ByVal DescriptionFilm As String) Titre = TitreFilm Annee = AnneeFilm Desciption = DescriptionFilm End Sub End Class Ensuite, dans la page contenant le code qui va permettre de sérialiser l'objet on va faire deux Imports, l'un permettant d'utiliser la sérialisation, le second permettant l'écriture dans un fichier : Code : VB.NET - Sélectionner 1 2 Imports System.Runtime.Serialization.Formatters.binary Imports System.IO Je ne sais pas si vous vous souvenez de la partie 1 sur les fichiers mais elle était fastidieuse car je vous faisais travailler sur des flux. La sérialisation reprend le même principe, nous allons ouvrir un flux d'écriture sur le fichier et la fonction de sérialisation va se charger de le remplir. Donc pour remplir un fichier bin avec un objet que je viens de créer : Code : VB.NET - Sélectionner 1 2 3 4 5 6 7 8 9 'On crée l'objet Dim Avatar As New Film("Avatar", 2009, "Avatar, film de James Cameron sorti en décembre 2009.") 'On crée le fichier et récupère son flux Dim FluxDeFichier As FileStream = File.Create("Film.bin") Dim Serialiseur As New BinaryFormatter 'Serialisation et écriture Serialiseur.Serialize(FluxDeFichier, Avatar) 'Fermeture du fichier FluxDeFichier.Close() Et pourquoi .bin l'extension du fichier ? Ce n'est pas obligatoire de lui assigner cette extension, c'est juste une convention. Comme lorsque nous créions des fichiers de configuration, nous avions tendance à les nommer en .ini, même si nous aurions pu leur donner l'extension .bla. Le BinaryFormatter est un objet qui va se charger de la sérialisation Binaire. C'est lui qui va effectuer le formatage spécifique à ce type de sérialisation. L'objet Avatar étant un film est désormais sauvegardé, si je veux récupérer les informations il faut que je le désérialise. La désérialisation est l'opposé de la sérialisation. Sur le principe de la lecture / écriture dans un fichier. La sérialisation écrit l'objet, la désérialisation le lit. Nous allons utiliser le même BinaryFormatter que lors de la sérialisation. Programmatiquement : Code : VB.NET - Sélectionner 1 2 3 4 5 6 7 8 9 10 11 If File.Exists("Film.bin") Then 'Je crée ma classe "vide" Dim Avatar As New Film() 'On ouvre le fichier et recupere son flux Dim FluxDeFichier As Stream = File.OpenRead("Film.bin") Dim Deserialiseur As New BinaryFormatter() 'Désérialisation et conversion de ce qu'on récupère dans le type "Film" Avatar = CType(Deserialiseur.Deserialize(FluxDeFichier), Film) 'Fermeture du flux FluxDeFichier.Close() End If Je vérifie avant tout que le fichier est bien présent. La ligne de désérialisation effectue deux opérations : la désérialisation et la conversion avec Ctype de ce qu'on récupère dans le type de notre classe (ici Film). Et on entre le tout dans "Avatar". Si vous analysez les attributs, vous remarquez que notre film a bien été récupéré. VB.Net est "intelligent", si vous n'aviez pas effectué de Ctype, il aurait tout de même réussi à l'insérer dans l'objet Avatar. La seule différence est que le Ctype offre une meilleure vue et compréhension de notre programme. La même remarque peut être faite lors de renvoie de valeurs via des fonctions, le type de retour n'est pas forcé d'être spécifié, une variable de type Object (spécifique à Visual Basic) sera alors retourné mais pour un programmeur, un code avec des "oublis" de ce type peut très vite devenir incompréhensible et ouvre la porte à beaucoup de possibilité d'erreur. Bon, je ne vous montre pas le contenu du fichier résultant, ce n'est pas beau à voir. Ce n'est pas fait pour ça en même temps, la sérialisation XML quand à elle va nous donner un résultat plus compréhensible et modifiable manuellement par un simple mortel. Voyons ça tout de suite. La sérialisation XML La sérialisation XML quand à elle respecte le protocole SOAP (Simple Object Access Protocol), le fichier XML que vous allez générer va pourvoir être transporté et utilisé plus facilement sur d'autres plateformes et langages de programmations qui respecteront eux aussi le protocole SOAP. Le format XML (je vous renvoie à sa page Wikipedia pour plus d'informations) formate le fichier sous une méthode bien spécifique composée de sections et sous-sections. Je vais reprends l'exemple de Wikipedia pour vous détailler rapidement sa composition : Code : XML - Sélectionner 1 2 3 4 5 6 7 8 9 10 11 12 <?xml version="1.0" encoding="UTF-8"?> <!-- '''Commentaire''' --> <élément-document xmlns="http://exemple.org/" xml:lang=";fr"> <élément>Texte</élément> <élément>élément répété</élément> <élément> <élément>Hiérarchie récursive</élément> </élément> <élément>Texte avec<élément>un élément</élément>inclus</élément> <élément/><!-- élément vide --> <élément attribut="valeur"></élément> </élément-document> La première ligne spécifiant une instruction de traitement, elle est nécessaire pour des logiciels traitant ce type de fichier, une convention encore une fois. Viens une ligne de commentaire, elle n'est pas censée nous intéresser car notre sérialisation ne génèrera pas de commentaire. Par contre le reste est intéressant. La sérialisation va convertir la classe en un noeud principal (élément racine) et ses attributs seront transformés en sous-éléments. Un exemple simple du résultat de la sérialisation : Code : VB.NET - Sélectionner 1 2 3 Public Class ClasseExemple Public ValeurNumerique As Integer End Class Code : XML - Sélectionner 1 2 3 <ClasseExemple> <ValeurNumerique>23</ValeurNumerique> </ClasseExemple> Vous arrivez à distinguer à l'oeil nu les corrélations qui sont présentes entre la classe et sa sérialisation, ce qui va être beaucoup plus facile pour les modifications manuelles. Bon, passons à la programmation. On va changer un l'import que nous utilisions pour la sérialisation binaire. Ce qui nous amène à écrire : Code : VB.NET - Sélectionner 1 2 Imports System.IO Imports System.Xml.Serialization Où System.IO contient toujours de quoi interagir avec les fichiers et System.Xml.Serialization les classes nécessaires à la sérialisation XML. Et dans notre code, presque aucun changement : Code : VB.NET - Sélectionner 1 2 3 4 5 6 7 8 Dim Avatar As New Film("Avatar", 2009, "Avatar, film de James Cameron sorti en décembre 2009.") 'On crée le fichier et récupère son flux Dim FluxDeFichier As FileStream = File.Create("Film.xml") Dim Serialiseur As New XmlSerializer(GetType(Film)) 'Serialisation et écriture Serialiseur.Serialize(FluxDeFichier, Avatar) 'Fermeture du fichier FluxDeFichier.Close() Eh oui, le principe de sérialisation reste le même, c'est juste un objet de type XmlSerializer qu'on instancie cette fois-ci. Il faut passer un argument à son constructeur : le type de l'objet que nous allons sérialiser. Ici c'est ma classe film donc la fonction GetType(Film) convient uploads/S4/ biblio-films 1 .pdf
Documents similaires
-
25
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Dec 30, 2022
- Catégorie Law / Droit
- Langue French
- Taille du fichier 0.4661MB