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 :

A propos XML et références circulaires lors la sérialisation


Sujet :

VB.NET

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut A propos XML et références circulaires lors la sérialisation
    Bonjour, j’utilise dans un projet plusieurs classes et souhaite utiliser la méthode très astucieuse et pratique de Thomas Levesque, concernant les références circulaires lors la sérialisation. [
    C#] Relation parent/enfant et sérialisation XML
    Jeudi 11 juin 2009 — Thomas Levesque dans son excelent blog (http://tomlev.wordpress.com/tag/serialisation-xml/)

    Mais voila tout se passe bien lors de la sérialisation mais la désérilisatopn ne se fait pas : Voici mes deux classes :
    La classe Lots et la Classe Soumissions_Entreprises
    La classe Soumissions_Entreprises reprend la classe Lots (voir plus bas):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Public Property _MyLot As New Lots
    Dim New_Soumissions As Soumissions_Entreprises = New Soumissions_Entreprises(Projet, "Thomas est le meilleur")
     
     
       With New_Soumissions
        .IChildItem_Parent = _MyLot
       End with
        _MyLot.ListSoumissions_Entreprises(New_Soumissions)
    Alors comment désérialiser cela !!!
    La classe LOTS
    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
     
    Namespace SMPE_ELT.Lots
        <Serializable()> Public Class Lots
            Inherits Element
           #Region "Constructeurs"
    	     Public Sub New()
                MyBase.New()
            End Sub
    		  Public Sub New(ByRef Projet As Projet, ByVal name As String)
                MyBase.New(Projet, name)
                ListSoumissions_Entreprises = New ChildItemCollection(Of Lots, Soumissions_Entreprises)(Me)
                                 End Sub
    	   #End Region
            Public Property ListSoumissions_Entreprises() As ChildItemCollection(Of Lots, Soumissions_Entreprises)
            Public Function SoumissionOffre_EntreprisesExist(ByVal _New_Soumissions As Soumissions_Entreprises) As Boolean
                For Each SoumissionOffre_Entreprise As Soumissions_Entreprises In ListSoumissions_Entreprises
                    If _New_Soumissions.Entreprise.Equals(SoumissionOffre_Entreprise.Entreprise) And _New_Soumissions.Offre_LotSoumissionné.Equals(SoumissionOffre_Entreprise.Offre_LotSoumissionné) Then
                        Return True
                    End If
                Next
                Return False
            End Function
            Public Function AddSoumissionOffre_Entreprise(ByVal _New_Soumissions As Soumissions_Entreprises) As Boolean
                If Not SoumissionOffre_EntreprisesExist(_New_Soumissions) Then
                    _New_Soumissions.Offre_LotSoumissionné = Me
                    ListSoumissions_Entreprises.Add(_New_Soumissions)
                                  Return True
                Else
                                  Return False
                End If
            End Function
        End Class
    End Namespace
    La classe Soumissions_Entreprises :
    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
     
    #Region "Imports"
    Imports System.Xml.Serialization
    Imports System.Globalization
    #End Region
    Namespace SMPE_ELT
        <Serializable()> Public Class Soumissions_Entreprises
            Inherits Element
            Implements IChildItem(Of Lots.Lots)
    #Region "IChildItem<Parent - Members"
            <XmlIgnore()> Public Property Offre_LotSoumissionné() As Lots.Lots 'Lots pour lesquelles l'entreprise soumissionne
    #Region "IChildItem<Parent> Members"
            Public Property IChildItem_Parent() As Lots.Lots _
                   Implements IChildItem(Of Lots.Lots).Parent
                Get
                    Return Offre_LotSoumissionné
                End Get
                Set(ByVal value As Lots.Lots)
                    Offre_LotSoumissionné = value
                End Set
            End Property
    #End Region
    #End Region
     
     
    #Region "Divers et variés"
     
    #End Region
    #Region "Constructeurs"
            Public Sub New()
                MyBase.New()
            End Sub
            Public Sub New(ByRef Projet As Projet, ByVal name As String)
                MyBase.New(Projet, name)
            End Sub
    #End Region
        End Class
    End Namespace

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Je pense que le problème est du au fait que ListSoumissions_Entreprises n'est pas initialisé dans le constructeur par défaut (sans paramètres). Et comme ChildItemCollection n'a pas de constructeur par défaut, le XmlSerializer ne peut pas l'initialiser lui-même.

    Il faut donc initialiser ListSoumissions_Entreprises dans les 2 constructeurs (ou appeler un des constructeur à partir de l'autre, de façon à initialiser cette collection dans tous les cas)

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut THKS
    Merci c'est gentil, ...

    J'avais envoyé également une seconde question et ne sait ou elle est passée??

    Citation Envoyé par tomlev Voir le message
    Je pense que le problème est du au fait que ListSoumissions_Entreprises n'est pas initialisé dans le constructeur par défaut (sans paramètres). Et comme ChildItemCollection n'a pas de constructeur par défaut, le XmlSerializer ne peut pas l'initialiser lui-même.

    Il faut donc initialiser ListSoumissions_Entreprises dans les 2 constructeurs (ou appeler un des constructeur à partir de l'autre, de façon à initialiser cette collection dans tous les cas)

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par manitas Voir le message
    J'avais envoyé également une seconde question et ne sait ou elle est passée??
    Elle est , tu peux la retrouver dans ton tableau de bord (clique sur "voir toutes les discussions suivies")

    N'oublie pas de marquer le sujet comme si le problème est réglé (bouton en bas de la page)

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut Comment faire pour le cas d'objet à plusieurs parents
    Merci pour tout Thomas; Cependant je souhaiterais savoir comment faire pour le cas courant de plusieurs parents d'un objet. Ce cas se présente en fait plus souvent qu'on ne le croies.

    Avez vous un exemple de codes ?
    MERCI encore.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Plusieurs parents ? c'est-à-dire ? Je ne vois pas d'exemple concret, essaie de détailler un peu plus ce que tu veux faire...

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut Plusieurs références circulaires dans la même classe...
    Merci de ta réponse et de ta gentillesse.
    En fait, je souhaite sérialiser un objet qui possède en référence circulaire d'autres objets dans la même classe.

    Dans la classe enfants, il y a plusieurs références circulaires or on ne fait l'implémentation qu'une seule fois: Implements IChildItem(Of t)
    Et j'ai besoin de le faire plusieurs fois comme dans ce cas avec Tbis, et tTierce....etc, dans la même 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     <Serializable()>Public Classe P
     Implements IChildItem(Of t)
     
         <XmlIgnore()> Public Property T_a() As T '
    #Region "IChildItem<Parent> Members"
     
            Public Property IChildItem_Parent() As T _
                   Implements IChildItem(Of T).Parent
                Get
                    Return autre_chose
                End Get
                Set(ByVal value As T)
                    autre_chose = value
                End Set
            End Property
     
    #End Region
     
    Comment faire pour d'autres Property...
        <XmlIgnore()> Public Property Tbis_a() As Tbis '
    #Region "IChildItem<Parent> Members"
     
            Public Property IChildItem_Parent() As Tbis _
                  Implements IChildItem(Of Tbis).Parent
                Get
                    Return autre_choseBis
                End Get
                Set(ByVal value As Tbis)
                    autre_choseBis = value
                End Set
            End Property
     
    #End Region
      etc...
     End Class

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ah OK, je comprends mieux... A priori il suffit que la classe implémente plusieurs interfaces : IChildItem(Of T), IChildItem(Of TBis), IChildItem(Of TTer), etc

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut Merci encore
    Oui c'est exactement cela....Je vais faire un test et vous tenir au courant. Pouvez vous et je vous ennuierais plus, , répondre à ma deuxième question concernant le clonage, copie d'objets..?? Merci beaucoup Thomas

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut Redondances..Quand tu nous tiens..!!!
    Il semble qu'en utilisant cette méthode, qui marche bien , les objets sérialisés se retrouvent en redondance dans le fichier XML...Comment résoudre ce problème, car le fichier devient vite volumineux!! MERCI

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Il n'y a pas de solution simple en utilisant la sérialisation XML, vu que celle-ci ne supporte pas les références d'objets. Donc si un objet appartient à plusieurs collections, il sera forcément sérialisé plusieurs fois...

    Sinon il faut gérer à la main ce qu'on sérialise ou non, mais ça risque de ne pas être très simple... Je ne suis pas sûr que la sérialisation XML soit adaptée pour ce genre de cas, la sérialisation binaire conviendrait sans doute mieux (ou éventuellement DataContractSerializer, qui sait gérer les références d'objets)

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut Je n'ai jamais utiliser le DataContractSerializer
    Merci pour ta réponse. Je n'ai malheureusement jamais utilisé le DataContractSerializer as-tu (puis-je tutoyer ..?) un exemple..?? Merci de nouveau. De mêm je bute stupidement sur une hsitoir de récupération d'eune classe que je dois diriger vers une autre et je ne sais qui peut m'aider (Voir: http://www.developpez.net/forums/d95...s/#post5344189)

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par manitas Voir le message
    Je n'ai malheureusement jamais utilisé le DataContractSerializer as-tu (puis-je tutoyer ..?) un exemple..?? Merci de nouveau.
    Tu peux me tutoyer bien sûr, je suis qd même pas si vieux
    Le principe est sensiblement le même qu'avec le XmlSerializer. Voilà un petit exemple :
    http://tlevesque.developpez.com/dotn...lization-2/#LV


    Citation Envoyé par manitas Voir le message
    De mêm je bute stupidement sur une hsitoir de récupération d'eune classe que je dois diriger vers une autre et je ne sais qui peut m'aider (Voir: http://www.developpez.net/forums/d95...s/#post5344189)
    Je ne comprends pas ce que tu veux dire. J'ai lu la question, je ne la comprends pas non plus

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut Merci de ta réponse
    En fait je possède une classe, qui a des propriétés:

    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
        <Serializable()> Public Class CritèresAttributionLot
            Inherits Element
            Implements ICloneable
     
    #Region "'Cela permet de cloner la classe"
     
            'Implements ICloneable à mettre sous Inherits...
            Public Function Clone() As Object _
                   Implements ICloneable.Clone
                Return Me.MemberwiseClone
            End Function
     
    #End Region
     
            'Cela permet de cloner la classe...
            Public Sub New()
                MyBase.New()
     
            End Sub
     
            Public Sub New(ByRef _MarchéPublic As MarchéPublic, ByVal name As String)
     
                ListSousCritèresAttributionLot = New List(Of SousCritèresAttributionLot)
            End Sub
     
    #Region "Members Type de critères"
     
            Public Property Critères_D_Elimination() As Boolean
            Public Property Critères_DeChoix() As Boolean
            Public Property Critères_Note() As Double
            Public Property Critères_NoteProposée() As Double
     
            'Note proposée pour l'entreprise
            Public Property Critères_Observations() As String
            Public Property Critères_Pondération_Note() As Double
            Public Property Critères_Type() As String
            Public Property ListSousCritèresAttributionLot As List(Of SousCritèresAttributionLot)
            <NonSerialized()> Private _Critères_Différence_Note_NoteProposée As Double
     
    #End Region
     
        End Class
    Bien je possède aussi une autre classe:
    Dépouillement:

    Celle ci doit récupérer toutes les propriétés de la classe CritèresAttributionLot, sachant qu'elle même possède ses propres ropriétés.
    Lorsque dans la classe CritèresAttributionLot une propréiété change, le changement doit se répercuter dans la classe Dépouillement.
    En fait il s'agit de voir comment copier-cloner des parties de classes vers une autre....Merci de ton aide...C'est hyper sympa!

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Tu peux faire ça à l'aide de la réflection, mais c'est un peu galère...

    Cette méthode permet de copier la propriété d'un objet vers un autre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Imports System.Reflection
     
    ...
     
    Public Sub CopyProperty(ByVal propertyName As String, ByVal sourceObject As Object, ByVal targetObject As Object)
        Dim sourceProp As PropertyInfo = sourceObject.GetType().GetProperty(propertyName)
        Dim targetProp As PropertyInfo = targetObject.GetType().GetProperty(propertyName)
     
        Dim value = sourceProp.GetValue(sourceObject, Nothing)
        targetProp.SetValue(targetObject, value, Nothing)
    End Sub
    Il faut juste que tu appelles cette méthode pour chaque propriété.


    Sinon, une autre méthode, plus propre et plus efficace, serait de définir toutes ces propriétés dans une interface implémentée par les deux classes. Ensuite tu peux copier automatiquement toutes les propriétés de l'interface d'un objet à l'autre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Sub CopyProperties(Of T)(ByVal source As T, ByVal target As T)
     
        For Each prop As PropertyInfo In GetType(T).GetProperties()
            Dim value As Object = prop.GetValue(source, Nothing)
            prop.SetValue(target, value, Nothing)
        Next
     
    End Sub

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Par défaut deux méthodes...
    Merci pour ces méthodes qui marchent bien....et bon WE

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

Discussions similaires

  1. [SQL 2K5] Pb : ON DELETE CASCADE : référence circulaire
    Par n00bi dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 29/05/2006, 08h48
  2. Référence circulaire
    Par Mvu dans le forum ASP
    Réponses: 3
    Dernier message: 27/04/2006, 14h38
  3. [EXCEL] : référence circulaire à cause d'une macro
    Par repié dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 11/01/2006, 10h41
  4. [XML-XSL] références interfichiers
    Par tatiana dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 02/08/2005, 10h25
  5. [DEB] DBdesigner 4 et référence circulaire
    Par Ranbaz dans le forum DBDesigner
    Réponses: 1
    Dernier message: 13/07/2005, 17h32

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