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 :

Serialization XML de ma classe qui ne fonctionne pas. [Débutant]


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut Serialization XML de ma classe qui ne fonctionne pas.
    Bonsoir a tous,
    J'ai vraiment besoin de votre aide. Cela fait un moment que je tourne autour du problème et je n'arrive pas a sérialiser la classe ci-dessous en XML.
    Si je supprime la ligne 'Me._ChildTasks.Add(Task)' la sérialisation fonctionne mais forcement il n'y a plus d'objets 'TaskBase' a serializer dans la liste.
    Si je serialize chaque Objet TaskBase un par un (en dehors de la classe) ceux-ci se serializent correctement. (Ce sont rigoureusement les mêmes objet que j'ajoute lors du Add).

    Le Message d'erreur n'est pas très parlant :
    Erreur lors de la génération du document XML.
    J'ai déjà sérialisé des List(Of T) mais jamais a l’intérieur d'une classe. Le fait qu'elle soit dans la classe pose t'il un problème ?
    Je sèche complètement j'espère que vous pourrez m'aider.

    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 TaskParent
        Private _ParentTaskName As String
        Private _ChildTasks As New List(Of TaskBase)
        Private _PProgress As Single
        Private _Statut As Statut
        Public Sub New()
     
        End Sub
        Public Sub New(ByVal ParentTaskName As String)
            Me._ParentTaskName = ParentTaskName
        End Sub
        Public Sub Add(ByVal Task As TaskBase)
            Me._ChildTasks.Add(Task)
            UpdateMe()
        End Sub
        Public Property ChildTasks() As List(Of TaskBase)
            Get
                Return _ChildTasks
            End Get
            Set(ByVal value As List(Of TaskBase))
                _ChildTasks = value
            End Set
        End Property
        Public ReadOnly Property PProgress() As Single
            Get
                Return _PProgress
            End Get
        End Property
        Public Property Statut() As Statut
            Get
                Return _Statut
            End Get
            Set(ByVal value As Statut)
                _Statut = value
                UpdateMe()
            End Set
        End Property
        Public Sub UpdateMe()
    ....
        End Sub
    End Class

  2. #2
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bon, il suffit que j’écrive pour avoir un début de solution :
    TaskBase est une classe de base (MustInherit), si je remplace TaskBase par une classe dérivée ça fonctionne.
    Reste a voir comment je peux modifier ma classe, peut-être en créant une liste spécifique pour chaque type dérivé mais y a t'il plus simple ?!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim Task1 as TaskDerivée
    Dim List As New List(Of TaskBase)
    List.Add(Task1)
    SaveXmlData("D:\Tasks.xml", List)

  3. #3
    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
    la sérialisation xml n'accepte pas tout

    par contre quand tu as ton erreur assez générique tu as aussi des innerexception à regarder qui expliquent bien le problème

    les list of avec plein de choses par exemple je suis pas sûr que ca passe (alors qu'en sérialisation binaire ca accepte, on a testé récemment (classe binaryformatter et mettre <serilizable> au dessus des classes à sérialiser))
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Merci beaucoup Pol63,
    J'ai trouvé ceci a propos de la serialization des classes dérivées :
    http://tlevesque.developpez.com/dotn...zation/#LIII-B
    Je ne pourrais tester que ce soir mais il est fort probable que le problème vienne de là.

    Je tiens beaucoup a la serialization XML, c'est quand même bien sympa de pouvoir vérifier le contenu des objets. mais par contre j'ai remarqué quelques contraintes liées a son utilisation (ou alors c'est moi qui ne sait pas bien m'en servir), comme l'obligation d'avoir un constructeur New sans arguments dans la classe a serializer et aussi l'obligation d'avoir des Propriétés "Non readOnly" sans quoi la propriété ne se serialize pas.

  5. #5
    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
    Citation Envoyé par BasicZX81 Voir le message
    mais par contre j'ai remarqué quelques contraintes liées a son utilisation (ou alors c'est moi qui ne sait pas bien m'en servir), comme l'obligation d'avoir un constructeur New sans arguments dans la classe a serializer et aussi l'obligation d'avoir des Propriétés "Non readOnly" sans quoi la propriété ne se serialize pas.
    c'est le principe oui, à la lecture du fichier xml le désérializeur instancie la classe par réflection et cherche donc un new public sans paramètres (rien n'empêche d'avoir 2 new)
    et les readonly c'est normal qu'il ne les sérialisent pas, par reflection là aussi il va écrire dans les propriétés les une après les autres, si pas de set pas de sérialisation
    après là aussi il y a des combines, tu peux avoir une propriété masquée (browsable false, designerserialiazitionvisibility hidden) qui est utilisée par la propriété readonly
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonsoir,
    Me voici de retour suite a mes essais, Ça fonctionne sans problème en ajoutant ces attributs dans ma classe de base 'TaskBase' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <Xml.Serialization.XmlInclude(GetType(TaskProcess))>
    <Xml.Serialization.XmlInclude(GetType(TaskThread))>
    Merci beaucoup pour la réponse et aussi pour les infos complémentaires

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

Discussions similaires

  1. [Python 3.X] classe qui ne fonctionne pas (pas d' "Erreur" non plus)
    Par ofortuna dans le forum Général Python
    Réponses: 6
    Dernier message: 10/10/2014, 22h31
  2. Parser XML qui ne fonctionne pas
    Par lansher1985 dans le forum Android
    Réponses: 4
    Dernier message: 23/07/2010, 20h10
  3. Réponses: 1
    Dernier message: 10/12/2009, 11h23
  4. Réponses: 0
    Dernier message: 02/12/2009, 08h27
  5. [FF] Exemple simple de XML qui ne fonctionne pas
    Par blueice dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 29/05/2007, 11h39

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