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

Windows Forms Discussion :

[VB.NET] Sérialisation XML de Collections


Sujet :

Windows Forms

  1. #1
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut [VB.NET] Sérialisation XML de Collections
    Bonjour à tous,

    j'aimerai pouvoir sérialiser en XML des objets plus ou moins complexes comme les collection, ou bien les ArrayList, voire simplement un tableau de String.

    J'utilisais XmlSerializer pour mes objets simples à moi, mais ceux cités ci-dessus ne peuvent pas etre sérialisés en XML. Il y a-t-il un moyen de faire ou des objets adaptés ? (le but étant de Sérialiser un liste de valeurs indexées (genre tableau de tableau))

    Merci de votre aide

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 109
    Points : 120
    Points
    120
    Par défaut sérialisation
    Il n'y a pas de problème pour sérilaliser un tableau ou un arraylist. Le framework s'occupe en grande partie de la tache. J'utilise en ce moment la serialisation pour transfèrer des objet dans des arraylist ou tableaux via des webservice.
    tu peux utilser les classes XmlArrayAttribute du namespace System.Xml.Serialization

    Pour sérialiser un tableau tu trouveras plus d'informations et des exemples sur le lien suivant :
    http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/cpref/html/frlrfsystemxmlserializationxmlarrayattributeclasstopic.asp

    nb: seules les variables ou accesseurs publiques sont sérialisables.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 109
    Points : 120
    Points
    120
    Par défaut sérialisation suite
    Pour être plus complet voici le lien vers un article intéressant. :
    http://msdn.microsoft.com/library/de...attributes.asp

    J'espère que ça t'aidera.
    Karlus

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    Merci de ton aide, alors plus précisément, voilà ce que je veux faire :

    voici ma classe tableau :
    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
    Imports System.Xml.Serialization
    Imports System.io
    Public Class Tableau
     
        Public monTableau As ArrayList
     
        Public Sub New()
            monTableau = New ArrayList
        End Sub
     
        Public Sub save()
            Try
                Dim sr As XmlSerializer
                sr = New XmlSerializer(GetType(Tableau))
                Dim writer As New StreamWriter("d:\test.xml")
                sr.Serialize(writer, Me)
                writer.Close()
            Catch e As Exception
                MsgBox("error writing configCom.xml")
            End Try
        End Sub
    End Class
    je m'en sers ainsi, ca marche bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                Dim leTab As New Tableau
                leTab.monTableau.Add("un")
                leTab.monTableau.Add("deux")
                leTab.monTableau.Add("trois")
                leTab.save()
    et ce que je voudrais faire, c'est plutot un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
                Dim leTab As New Tableau
                Dim monObj As New Collection
                monObj.Add("un")
                monObj.Add("deux")
                monObj.Add("trois")
                leTab.monTableau.Add(monObj)
                Dim monObj2 As New Collection
                monObj2.Add("quatre")
                monObj2.Add("cinq")
                monObj2.Add("six")
                leTab.monTableau.Add(monObj2)
                leTab.save()
    sachant que j'utilise une collection, comme je pourrais bien utiliser autre chose car c'est j'ai un nombre fixe d'élèments.

    et là ... ca ne marche pas.

    Comment faire ?

    Merci de vos aides

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 109
    Points : 120
    Points
    120
    Par défaut
    Désolé je ne connais pas la syntaxe VB.net mais tu veux serialiser un tableau qui contient une collection de string... Dans ce cas il faut preciser que cette collection contient des chaines par un attribut [XmlArrayItem,Type = typeof(string)] et préciser de la même façon que le tableau contient des éléments de type arraylist. Si tu as plusieurs type d'objet , il faut le préciser pour chacun des types.

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    pourrais-tu me montrer un exemple de déclaration ? meme s'il est en c#

    Une autre question, la collection peut-elle etre utilisée comme variable locale uniquement pour etre ajoutée au tableau ?

    Merci d'avance

  7. #7
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    Sinon, il me vient une autre idée, au lieu de faire une collection, je pourrais utiliser une classe perso puisque je sais déjà combien d'élèments je vais avoir.
    du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <Serializable()> Public Class MesChamps
        Private un_ As String
        Private deux_ As String
        Private trois_ As String
        Sub New(ByVal un As String, ByVal deux As String, ByVal trois As String)
            un_ = un
            deux_ = deux
            trois_ = trois
        End Sub
    End Class
    d'où finalement mon code avant la sérialisation devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            Dim leTab As New Tableau
            Dim un As New MesChamps("un", "deux", "trois")
            leTab.monTableau.Add(un)
            Dim deux As New MesChamps("quatre", "cinq", "six")
            leTab.monTableau.Add(deux)
            leTab.save()
    C'est certainement plus simple, mais la sérialisation provoque une exception encore, ai-je oublié qqchose ?

    Merci de vos aides

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 109
    Points : 120
    Points
    120
    Par défaut
    Dans mon cas j'utilise des classes dédiées ne servant qu'à transférer les données. Voici un exemple :
    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
     
     
    [Serializable]
    [XmlRoot(ElementName = "MaClasse", IsNullable=false)]
    	public class MaClasse
    	{
     
    		private int _Id = 0;
    		private IList _list = null;
     
    		[XmlAttribute]
    		public int Id
    		{
    			get {return _Id ;}
    			set {_Id = value;}
    		}
     
    		[XmlArray(ElementName = "ListeObjetA")]
    		[XmlArrayItem("ObjetA",Type = typeof(ObjetA))]
    		public IList List
    		{
    			get {return _list;}
    			set {_list = value;}
    		}
     
    		public MaClasse()
    		{
     
    		}
    Ma classe est alors sérialisable ainsi que la collection des objetsA si bien sur l'objetA est lui même serialisable.

    Il est aussi posssible d'utiliser des variables locales ou bien des classes pour lesquelles on a pas l'accès au code source. Dans ce cas il faut utiliser des objets XmlAttributes et XmlAttributeOverrides et passer en paramètre cet attribut à l'objet XmlSerializer. Cependant je n'ai pas essayé cette méthode préférant utiliser des objets de transfert de données utilisés dans l'ensemble de l'application .

    Voilà j'espère que ça t'aidera.

  9. #9
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    Merci beaucoup pour tes liens et tes exemples, après moultes tests, je crois que je suis arrivé à faire ce que je voulais.

    Merci encore

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

Discussions similaires

  1. La sérialisation XML avec .NET
    Par tomlev dans le forum Général Dotnet
    Réponses: 16
    Dernier message: 02/03/2015, 16h14
  2. [VB.NET] Document XML
    Par leSeb dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/02/2006, 14h46
  3. [VB.NET] Transformation XML -> HTML
    Par marsu381 dans le forum ASP.NET
    Réponses: 7
    Dernier message: 27/09/2005, 10h38
  4. [vb.net] [deb.] Verrouiller une collection
    Par Manix dans le forum Windows Forms
    Réponses: 1
    Dernier message: 19/08/2005, 07h51
  5. [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

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