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

C# Discussion :

XmlSerializer.Deserialize + propriété List = ECHEC ?!


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 38
    Par défaut XmlSerializer.Deserialize + propriété List = ECHEC ?!
    Bonjour,

    je suis en train de me casser les dents sur un problème étrange, concernant une déserialisation avec XmlSerializer.

    Mon but est de déserialiser une propriété de type List<T>. La sérialisation fonctionne parfaitement.
    Si le getter de la propriété est du genre "return maList", pas de problème. Si je fais un getter un peu différent, la déserialisation ne fonctionne plus.

    Pour reproduire le problème, voilà du code simplissime :

    1) D'abord, une classe de base toute bête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        public class Foo
        {
            public String name;
            public Foo() { }
     
            public Foo(String nameOfThis)
            {
                name = nameOfThis;
            }
        }
    2) Le container d'une liste privée d'instances Foo, avec une propriété publique pour y accéder avec xmlSerializer.
    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
     
    [XmlRoot("Bar")]
        public class Bar
        {
            private List<Foo> list = new List<Foo>();
     
            public Bar() { }
     
            public void Add(String n)
            {
                list.Add(new Foo(n));
            }
     
            public List<Foo> l
            {
                get
                {
                    //List<Foo> lTemp = new List<Foo>();
                    //foreach (Foo f in list)
                    //{
                    //    if (f.name != "2nd")
                    //        lTemp.Add(f);
                    //}
                    //return lTemp;
                    return list;
                }
                set { list = value; }
            }
        }
    Et enfin le code d'execution.
    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
    class Program
        {
            static void Main(string[] args)
            {
                Bar b = new Bar();
                b.Add("1er");
                b.Add("2nd");
                b.Add("3eme");
     
                XmlSerializer serializer = new XmlSerializer(typeof(Bar));
                StreamWriter myWriter = new StreamWriter("testSerialisation.xml");
                serializer.Serialize(myWriter, b);
                myWriter.Close();
     
                Bar myObject;
                XmlSerializer mySerializer = new XmlSerializer(typeof(Bar));
                FileStream myFileStream = new FileStream("testSerialisation.xml", FileMode.Open);
                myObject = (Bar)mySerializer.Deserialize(myFileStream);
     
                System.Diagnostics.Debug.Assert(myObject.l.Count == b.l.Count);
            }
        }

    Donc comme vous pouvez le constater, ce code enregistre simplement la liste et la restaure. CE CODE FONCTIONNE, la déserialisation ne pose pas de problème.

    Maintenant, dans le getter, décommentez les lignes et commentez la dernière. Relancez. La sérialisation fonctionne, mais pas la déserialisation. list est vide !!!!

    Pourtant les fichiers de sorties sont similaires. Il semblerait que lorsqu'un getter n'est pas trivial, la déserialisation échoue...

    Est-ce que j'ai oublié quelque chose dans la manipulation du xmlSerializer ? ou alors est-ce un bug bizarre ???

  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 : 43
    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 crois savoir pourquoi...

    En fait, quand le XmlSerializer désérialise une collection, il ne passe pas par le setter de la propriété (d'ailleurs si tu supprimes l'accesseur set ça fonctionne pareil) : il récupère la collection avec le get, et y ajoute les éléments du XML. Or, dans ton get tu renvoies une liste temporaire, c'est donc à cette liste que les éléments sont ajoutés et non à list...

  3. #3
    Membre averti
    Inscrit en
    Juillet 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 38
    Par défaut
    Exact!

    Si au début du get, je rajoute ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (list == null || list.Count == 0)
                        return list;
    et ben ca marche!

    Merci beaucoup!

    J'en profite pour critiquer un peu le framework :
    1) c'est pas intuitif comme fonctionnement (comme tu le dis, si on laisse le set vide, et ben il déserialize quand même les données.)
    2) Ca empeche de créer un set personnalisé qui désérialize de manière "intéligente"...

  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 : 43
    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 rockeye Voir le message
    J'en profite pour critiquer un peu le framework :
    1) c'est pas intuitif comme fonctionnement (comme tu le dis, si on laisse le set vide, et ben il déserialize quand même les données.)
    2) Ca empeche de créer un set personnalisé qui désérialize de manière "intéligente"...
    Oui, mais d'un autre côté, en général les propriétés qui renvoient une collection sont en lecture seule. Si la sérialisation XML utilisait le set, elle ne pourrait pas désérialiser ces propriétés, alors que là, même si tu enlèves le set, ça marche toujours.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Par défaut
    Bonsoir,

    J'ai à peu près le même problème en sérialisant une matrice de ma fabrication (elle est à taille variable et peut contenir des trous)
    Etant donné que j'ai changé la List que j'avais avant pour cette structure, j'ai changé le setter et le getter pour passer de ma matrice à un objet de type List

    Donc la sérialisation marche très bien, et comme rockeye, le setter n'est pas utilisé par XmlSerializer.

    Suivant les explications données ici, j'ai ajouté ça au tout début de mon getter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (_matrice == null || _matrice.Count == 0)
        return null;
    Avec ça, je remarque qu'il appelle 2 fois le setter mais avec des listes vides alors que mon fichier xml contient bien des éléments pour cette propriété !

  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 : 43
    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 va falloir que tu montres un peu plus de code, avec ce que tu as mis ça va être difficile de t'aider

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

Discussions similaires

  1. [CSS 3] propriété "list-style-type" problème de validation
    Par jolla dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 11/11/2012, 10h33
  2. [XL-2007] Propriétés listes déroulantes
    Par issoram dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/10/2010, 16h52
  3. Ajout de propriétés liste créée avec Données, Validation
    Par acaly dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/01/2010, 09h34
  4. Réponses: 5
    Dernier message: 12/10/2009, 17h03
  5. Ajout d'une propriété "liste"
    Par MrPatel dans le forum Windows Forms
    Réponses: 2
    Dernier message: 27/07/2007, 09h53

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