IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

[XmlSerializer] Utilisation de cette classe avec une liste de classe et sérialisation XML


Sujet :

VB.NET

  1. #1
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut [XmlSerializer] Utilisation de cette classe avec une liste de classe et sérialisation XML
    Bonjours à tous,

    Je voudrais m'initier un peut dans la sérialisation XML.

    J'ai crée une classe clsClient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    Public Class clsClient
        Private _Id As Integer
        Private _Nom As String
        Private _Prenom As String
        Private _Telephone As String
        Private _Portable As String
        Private _Adresse As String
        Private _CodePostal As String
        Private _Ville As String
        Private _Email As String
        Private _NbReserv As Integer
        Private _Commentaire As String
        Private _Alerte As Boolean
     
        Public Sub New()
            _Id = 0
            _Nom = ""
            _Prenom = ""
            _Telephone = ""
            _Portable = ""
            _Adresse = ""
            _CodePostal = ""
            _Ville = ""
            _Email = ""
            _NbReserv = 0
            _Commentaire = ""
            _Alerte = False
        End Sub
     
        Public Property ID() As Integer
            Get
                ID = _Id
            End Get
            Set(ByVal value As Integer)
                _Id = value
            End Set
        End Property
        Public Property NbReserv() As Integer
            Get
                NbReserv = _NbReserv
            End Get
            Set(ByVal value As Integer)
                _NbReserv = value
            End Set
        End Property
        Public Property Nom() As String
            Get
                Nom = _Nom
            End Get
            Set(ByVal value As String)
                _Nom = value
            End Set
        End Property
        Public Property Prenom() As String
            Get
                Prenom = _Prenom
            End Get
            Set(ByVal value As String)
                _Prenom = value
            End Set
        End Property
        Public Property Telephone() As String
            Get
                Telephone = _Telephone
            End Get
            Set(ByVal value As String)
                _Telephone = value
            End Set
        End Property
        Public Property Portable() As String
            Get
                Portable = _Portable
            End Get
            Set(ByVal value As String)
                _Portable = value
            End Set
        End Property
        Public Property CodePostal() As String
            Get
                CodePostal = _Portable
            End Get
            Set(ByVal value As String)
                _CodePostal = value
            End Set
        End Property
        Public Property Adresse() As String
            Get
                Adresse = _Adresse
            End Get
            Set(ByVal value As String)
                _Adresse = value
            End Set
        End Property
        Public Property Ville() As String
            Get
                Ville = _Ville
            End Get
            Set(ByVal value As String)
                _Ville = value
            End Set
        End Property
        Public Property Email() As String
            Get
                Email = _Email
            End Get
            Set(ByVal value As String)
                _Email = value
            End Set
        End Property
     
        Public Property Commentaire() As String
            Get
                Commentaire = _Commentaire
            End Get
            Set(ByVal value As String)
                _Commentaire = value
            End Set
        End Property
     
        Public Property Alerte() As Boolean
            Get
                Alerte = _Alerte
            End Get
            Set(ByVal value As Boolean)
                _Alerte = value
            End Set
        End Property
     
    End Class

    Pour mes essais je crée un fichier client XML avec ceux ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
        Private Sub btValider_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btValider.Click
            Dim client As clsClient
            Dim xs As XmlSerializer
            Dim wr As StreamWriter
            Dim List As New List(Of clsClient)
            Dim i As Integer
            'Pour les essaies je crée 6 clients
    reprise:
            client = New clsClient
            client.ID = CInt(txtIDClient.Text) + i
            client.Nom = txtNom.Text
            client.Prenom = txtPrenom.Text
            client.Adresse = txtAdress.Text
            client.CodePostal = txtCodePostale.Text
            client.Commentaire = txtCommentaire.Text
            client.Email = txtEmail.Text
            client.Portable = txtPortable.Text
            client.Telephone = txtTelephone.Text
            client.Ville = txtVille.Text
            List.Add(client)
     
            If i <= 5 Then
                i += 1
                GoTo reprise
            End If
     
            wr = New StreamWriter("Client.xml")
            xs = New XmlSerializer(GetType(List(Of clsClient)))
            xs.Serialize(wr, List)
            wr.Close()
        End Sub

    Cela fonctionne super bien. Mais lorsque je souhaite faire l'inverse cela fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Public Sub loadClients()
            Dim sr As New StringReader(Application.StartupPath & "/Client.xml")
            Dim Lists As New List(Of clsClient)
            Dim xs As XmlSerializer
            Dim client As clsClient
     
            xs = New XmlSerializer(GetType(List(Of clsClient)))
     
            Lists = xs.Deserialize(sr) 'cela plante ici
            sr.close()
        End Sub
    Il me dit :

    Une erreur s'est produite lors de la création du formulaire. Pour plus d'informations, consultez Exception.InnerException. L'erreur est : Il existe une erreur dans le document XML (1, 1).

    Merci de votre aide, je recherche de mon coté.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    le binaryformatter est beaucoup plus performant, beaucoup moins contraignant, et le fichier prend moins de place
    il faut par contre que les classes aient l'attribut <serializable> (c'est peut etre le cas de list), et ce n'est pas modifiable depuis un éditeur de fichier simple
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Public Sub loadClients()
            Dim Lists As New List(Of clsClient)
            Dim xs As New XmlSerializer(GetType(List(Of clsClient)), New XmlRootAttribute("ArrayOfClsClient"))
            Using stream = New System.IO.StreamReader("D:\data\fichier XML\Client.xml") 
                ' désérialise le document XML présent dans le flux (stream) spécifié en le castant au type de la liste.
                Lists = CType(xs.Deserialize(stream), List(Of clsClient))
            End Using
        End Sub

    Ou tu gères et indiques l'élément racine xml

    Sauvegarde
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            wr = New StreamWriter("D:\data\fichier XML\Client.xml")
            xs = New XmlSerializer(GetType(List(Of clsClient)), New XmlRootAttribute("Clients"))
            xs.Serialize(wr, List)
    Lecture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Public Sub loadClients()
            Dim Lists As New List(Of clsClient)
            Dim xs As New XmlSerializer(GetType(List(Of clsClient)), New XmlRootAttribute("Clients"))
            Using stream = New System.IO.StreamReader("D:\data\fichier XML\Client.xml") 
                ' désérialise le document XML présent dans le flux (stream) spécifié en le castant au type de la liste.
                Lists = CType(xs.Deserialize(stream), List(Of clsClient))
            End Using
        End Sub

    Pour info fait un while au lieu d'un goto
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        ' Pour les essais je crée 6 clients
        While i <= 5
            client = New clsClient
            client.ID = CInt(txtIDClient.Text) + i
            client.Nom = txtNom.Text
            '...
            client.Ville = txtVille.Text
            List.Add(client)
            i += 1
        End While
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  4. #4
    Membre averti Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    929
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : VB6/VB.net/C/C++/C#
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2008
    Messages : 929
    Points : 312
    Points
    312
    Par défaut
    Citation Envoyé par rv26t Voir le message
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Public Sub loadClients()
            Dim Lists As New List(Of clsClient)
            Dim xs As New XmlSerializer(GetType(List(Of clsClient)), New XmlRootAttribute("ArrayOfClsClient"))
            Using stream = New System.IO.StreamReader("D:\data\fichier XML\Client.xml") 
                ' désérialise le document XML présent dans le flux (stream) spécifié en le castant au type de la liste.
                Lists = CType(xs.Deserialize(stream), List(Of clsClient))
            End Using
        End Sub

    Ou tu gères et indiques l'élément racine xml

    Sauvegarde
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            wr = New StreamWriter("D:\data\fichier XML\Client.xml")
            xs = New XmlSerializer(GetType(List(Of clsClient)), New XmlRootAttribute("Clients"))
            xs.Serialize(wr, List)
    Lecture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Public Sub loadClients()
            Dim Lists As New List(Of clsClient)
            Dim xs As New XmlSerializer(GetType(List(Of clsClient)), New XmlRootAttribute("Clients"))
            Using stream = New System.IO.StreamReader("D:\data\fichier XML\Client.xml") 
                ' désérialise le document XML présent dans le flux (stream) spécifié en le castant au type de la liste.
                Lists = CType(xs.Deserialize(stream), List(Of clsClient))
            End Using
        End Sub


    Pour info fait un while au lieu d'un goto
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        ' Pour les essais je crée 6 clients
        While i <= 5
            client = New clsClient
            client.ID = CInt(txtIDClient.Text) + i
            client.Nom = txtNom.Text
            '...
            client.Ville = txtVille.Text
            List.Add(client)
            i += 1
        End While

    Merci cela fonctionne parfaitement.

    Pour le While oui c'est clair que c'est plus propre, des vielles habitudes que j'ai récupérer sur du code VB6 qui était deja programmé.


    Je vais regarder ce qu'est binaryformatter Pol63


    Merci à vous 2

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/09/2014, 16h53
  2. Utilisation CASE WHEN avec une liste de valeurs
    Par mortimer.pw dans le forum PL/SQL
    Réponses: 5
    Dernier message: 26/03/2009, 12h50
  3. utilisation d'un selectOneMenu avec une liste
    Par mouaa dans le forum JSF
    Réponses: 6
    Dernier message: 04/11/2008, 12h34
  4. Utilisation de random avec une liste
    Par husobom dans le forum Prolog
    Réponses: 4
    Dernier message: 24/11/2007, 23h43
  5. STL Problème avec une liste d'instances de class
    Par BruceBoc dans le forum SL & STL
    Réponses: 12
    Dernier message: 16/02/2007, 14h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo