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 :

Sérialisation XML de collection d'Objets


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de megamario
    Homme Profil pro
    VB6/VB.net/C/C++/C#
    Inscrit en
    Septembre 2008
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Indre et Loire (Centre)

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut Sérialisation XML de collection d'Objets
    Bonjour à tous,

    J'ai un souci avec la sérialisation d'une collection qui contient elle même des collections.

    J'ai donc une collection:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public ListData As New List(Of clsData)
    clsData se présente sous la forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    Public Class clsData
        Public Property NumberKey As String = ""
        Public Property NumberCmd As String = ""
        Public Property NumberUpd As String = ""
        Public Property NameCustomer As String = ""  
        Public Property Article As New List(Of String) From {""}    
        Public Property SoftWare As New List(Of String) From {""} 
        Public Property Level As New List(Of String) From {""} 
    End Class
    Pour créer mon XML pas de souci mais un détail quand même que j'explique après:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        Public SubWriteFile(ByVal MyFile As String)
            Dim wr As StreamWriter
            Dim xs As XmlSerializer
            'Serialisation XML
            wr = New StreamWriter(MyFile)
            xs = New XmlSerializer(GetType(List(Of clsData)), New XmlRootAttribute("Lic"))
            xs.Serialize(wr, ListData)
            WriteFile = True
            wr.Close()
        End Sub
    J'ai bien sur épuré ici le code des vérifications nécessaires.

    Donc tout se passe bien, cela me créer mon fichier XML avec un détail cependant.:
    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <Lic xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <clsData>
        <NumberKey>123456789</NumberKey>
        <NumberCmd>80000</NumberCmd>
        <NumberUpd>1</NumberUpd>
        <NameCustomer>MonEntreprise</NameCustomer>
        <Article>
          <string />
          <string>B00123466789</string>
          <string>B00987654321</string>
        </Article>
        <SoftWare>
          <string />
          <string>MonLogiciel1</string>
          <string>MonLogiciel2</string>
        </SoftWare>
        <Level>
          <string />
          <string>User</string>
          <string>Admin</string>
        </Level>
      </clsData>
    </Lic
    Ici avec l'exemple d'une seule entrée qui comporte 2 sous ensembles, Articles/SoftWare/Level, mais si j'en rentre plusieurs, pas de souci.
    Par contre comme vous pouvez constater j'ai 2 objets(sous ensemble) dans Articles, SoftWare et Level, mais il m'en met 3 avec le 1er vide.

    Jusque là, après le fait qu'il me met 3 objets au lieu de 2 cela me va, par contre a la relecture j'ai un souci.

    Relecture du fichier XML avec cette méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Public Sub OpenData(ByVal MyFile As String)
         Dim xs As XmlSerializer
         'deserialisation
          xs = New XmlSerializer(GetType(List(Of clsData)), New XmlRootAttribute("Lic"))
          Using stream = New System.IO.StreamReader(MyFile)
               ListData = CType(xs.Deserialize(stream), List(Of clsData))
          End Using
    End Sub
    La lecture ce passe bien mais lorsque je regarde ListData, il m'indique bien que mes collections Articles/SoftWare/Level ont 2 éléments mais je n'est que le dernier de renseigné, les autres sont vides.
    Idem si j'en met 5 ou 6 sous ensemble, j'ai toujours que le dernier de renseigné.

    Avez vous une idée ?

    Merci de votre aide

  2. #2
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Bonsoir,

    C'est normal qu'il te renseigne dans chaque noeuds (Article, Software, Level) une valeur vide de type String puisque dans ta classe "clsdata" tu instancies chaque propriété et affecte une valeur en même temps :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        Public Property Article As New List(Of String) From {""}    
        Public Property SoftWare As New List(Of String) From {""} 
        Public Property Level As New List(Of String) From {""}
    Il faut procéder ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        Public Property Article As New List(Of String) 
        Public Property SoftWare As New List(Of String)
        Public Property Level As New List(Of String)
    J'irais même jusqu'à dire : pour une meilleur lisibilité du code je procéderais ainsi pour l'implémentation de ta classe :

    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
     
    Public Class clsData
     
        Public Property NumberKey As String = ""
        Public Property NumberCmd As String = ""
        Public Property NumberUpd As String = ""
        Public Property NameCustomer As String = ""  
        Public Property Article As List(Of String)  
        Public Property SoftWare As List(Of String)
        Public Property Level As List(Of String)
     
        Sub New
            _Article = New List(Of String)   
            _SoftWare = New List(Of String)
            _Level = New List(Of String)
        End Sub
     
    End Class
    Pour le reste difficile de se prononcer car on ne sait pas :

    - on est déclaré ceci (dans quelle classe) : Public ListData As New List(Of clsData) ???
    - tes procédures de serialisation sont-elles stockées dans une classe à part ???

    NB : Ça n'engage que moi mais je peux supposer que ton problème est lié au fait que l'instanciation ne se fait pas au bon endroit du coup il conserve le dernier objet !

    Peut-être qu'on appréhenderait mieux ton problème avec les classes complètes tout simplement.

    Cdlt.

    A+

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

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 931
    Par défaut
    Bonjour wallace1,

    Ba oui je suis bête , je pensais tableau et non collection.
    J'ai suivi vos conseils pour la déclaration des list dans clsData et cela à résolu tout mes soucis. L’écriture du XML est nickel maintenant et la lecture rempli tout les champs, c'est impeccable.

    Je vous remercie.

    Une petite question toutefois. Vous avez rajouté un _ aux variables dans le new ? Je me suis aperçu que cela fonctionne aussi !! Est ce que l'IDE recréer implicitement ces variables.

    Avant effectivement lorsque je déclarais mes classes serialisable je le faisait ainsi.
    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
     
    Public Class clsData
     
        Private _NumberKey As String
     
        Sub New
            _NumberKey = ""
        End Sub
     
        Public Property NumberKey () As String
            Get
                NumberKey  = _NumberKey 
            End Get
            Set(value As String)
                _NumberKey  = value
            End Set
        End Property
     
    End Class

  4. #4
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    bonjour,

    Pas de quoi pour l aide apportée ; )
    Tu as vu juste dès lors que tu declares une propriété l'IDE considere que le nom de sa variable associée prefixée d un underscore (de portée privée), existe. Donc en tant que bon développeur bien faineant j'use de ce qui me fait gagner du temps.
    Il existe plusieurs ecoles, certains te diront c est le mal et d autres ..... y verront une plus value.

    PS : il faut prendre l habitude de declarer le constructeur afin d y placer tes instanciation ou affectation, cela t evitera bien des problemes par la suite.

    a+

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

Discussions similaires

  1. Collection d'objets ArrayList via XML
    Par sabri_0001 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 12/07/2015, 01h45
  2. [VB6] [XML][DOM] Collection DOMNodeList vide
    Par Ykh'Drazhir dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 04/01/2005, 14h35
  3. [VB.NET] Sérialisation XML de Collections
    Par nico-pyright(c) dans le forum Windows Forms
    Réponses: 8
    Dernier message: 15/12/2004, 15h28
  4. [C#] Créer un fichier Xml à partir d'un objet
    Par Troopers dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/09/2004, 13h23
  5. [VB6] Sauvegarder une collection d'objets
    Par Sayagh dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 19/09/2003, 11h58

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