Bon, jusqu'à présent aucun problème pour ce qui est de sérialiser notre petit film "Avatar".
Mais immaginez que nous voulons enregistrer toute une bibliothèque de films (une idée de TP ?

).
Déjà, avant que vous vous enfonciez je vous dis qu'avec notre méthode ça ne va pas être possible.
Et pourquoi ça ?
Eh bien vous avez vus que le noeud principal de notre document XML est <Film>, et j'ai dit qu'il ne pouvait avoir qu'un seul nœud principal par document XML. autrement dit, qu'un seul film.
Certes il reste l'idée de créer un fichier XML par Film à sauvegarder mais je pense que ce n'est pas la meilleure méthode

.
Rappelez vous de nos amis les tableaux. Un tableau de string, vous vous souvenez, et dans une TP je vous ai tendu un piège en faisant un tableau de RadioButtons.
Ça va être le même principe ici, un tableau de films.
Oui, il fallait juste y penser. Ce qui nous donne en création d'un tableau de films et sérialisation du tout :
Code : VB.NET | Dim Films(1) As Film
Films(0) = New Film("Avatar", 2009, "Avatar, film de James Cameron sorti en décembre 2009.")
Films(1) = New Film("Twilight 3", 2010, "Troisième volet de la quadrilogie Twilight")
'On crée le fichier et récupère son flux
Dim FluxDeFichier As FileStream = File.Create("Films.xml")
Dim Serialiseur As New XmlSerializer(GetType(Film()))
'Serialisation et écriture
Serialiseur.Serialize(FluxDeFichier, Films)
'Fermeture du fichier
FluxDeFichier.Close()
|
Pour la création du tableau, je ne vous fais pas d'explication je pense. Un tableau de 2 cases, Avatar dans la première, Twilight 3 dans la seconde (il va falloir que je mette à jour ce tuto dans le futur, avec les films du moment

).
La seule particularité est le type que l'on fournit au XmlSerializer. Ce n'est pas un simple
GetType(Film)
, autrement dit le type de ma classe Film mais c'est
GetType(Film())
, le type d'un tableau de ma classe Film.
Une fois la sérialisation effectuée, notre fichier se compose ainsi :
Code : XML 1
2
3
4
5
6
7
8
9
10
11
12
13 | <?xml version="1.0"?>
<ArrayOfFilm xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Film>
<Titre>Avatar</Titre>
<Annee>2009</Annee>
<Desciption>Avatar, film de James Cameron sorti en décembre 2009.</Desciption>
</Film>
<Film>
<Titre>Twilight 3</Titre>
<Annee>2010</Annee>
<Desciption>Troisième volet de la quadrilogie Twilight</Desciption>
</Film>
</ArrayOfFilm>
|
Le nœud principal est désormais un
ArrayOfFilm, soit un
Tableau de Film. Et chaque nœud secondaire correspond à un film.
La désérialisation est pratiquement la même elle aussi :
Code : VB.NET | If File.Exists("Film.xml") Then
'On ouvre le fichier et recupere son flux
Dim FluxDeFichier As Stream = File.OpenRead("Film.xml")
Dim Deserialiseur As New XmlSerializer(GetType(Film()))
'Désérialisation et insertion dans le tableau de Film()
Dim Films() As Film = Deserialiseur.Deserialize(FluxDeFichier)
'Fermeture du flux
FluxDeFichier.Close()
End If
|
Ici, même remarque que pour la sérialisation, le type qu'on fournit est bien un tableau de Film() et non plus un Film simple.
Seconde remarque : j'ai effectué la déclaration de mon tableau sur la même ligne que la désérialisation. Cela me permet de m'affranchir de la déclaration fixe du la longeur de mon tableau.
Autrement dit, le programme va se charger tout seul de déterminer combien il y a de films présents et construira un tableau de taille nécessaire. J'ai fait ceci en écrivant
Films() au lieu de
Films(1). Mais le résultat sera le même, et au moins pas de risque d'erreurs de taille =)
Et en ce qui concerne les collections, que nous venons d'aborder ; la méthode est la même :
Code : VB.NET 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 | Imports System.IO
Imports System.Xml.Serialization
Module Module1
Sub Main()
Dim MaListeDeClasses As New List(Of Classe)
MaListeDeClasses.Add(New Classe("Avatar"))
MaListeDeClasses.Add(New Classe("Twilight 1"))
MaListeDeClasses.Insert(0, New Classe("Titanic"))
'On crée le fichier et récupère son flux
Dim FluxDeFichier As FileStream = File.Create("C:\Classes.xml")
Dim Serialiseur As New XmlSerializer(GetType(List(Of Classe)))
'Serialisation et écriture
Serialiseur.Serialize(FluxDeFichier, MaListeDeClasses)
'Fermeture du fichier
FluxDeFichier.Close()
End Sub
End Module
Public Class Classe
Private _Variable As String
Sub New()
End Sub
Sub New(ByVal Variable As String)
_Variable = Variable
End Sub
Public Property Variable As String
Get
Return _Variable
End Get
Set(ByVal value As String)
_Variable = value
End Set
End Property
End Class
|
Sur le même principe, le GetType s'effectue sur une List(Of Classe). Et le fichier XML résultant a le même schéma qu'un tableau :
Code : XML 1
2
3
4
5
6
7
8
9
10
11
12 | <?xml version="1.0"?>
<ArrayOfClasse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Classe>
<Variable>Titanic</Variable>
</Classe>
<Classe>
<Variable>Avatar</Variable>
</Classe>
<Classe>
<Variable>Twilight 1</Variable>
</Classe>
</ArrayOfClasse>
|
Il serait même préférable à présent d'utiliser des collections, qui sont plus modulaires et qui représentent mieux les concepts de la POO que des tableau (archaïques)

.