Developpez.com - Rubrique XML

Le Club des Développeurs et IT Pro

Tutoriel : La sérialisation XML avec .NET

Par Thomas Levesque

Le 2009-02-17 16:17:13, par tomlev, Rédacteur/Modérateur
Cette discussion est consacrée à l'article intitulé La sérialisation XML avec .NET. Vous pouvez y poster vos commentaires concernant l'article.

Synopsis :
Ce tutoriel explique comment sérialiser et désérialiser des objets en XML à l'aide des fonctionnalités du .NET Framework. On verra notamment comment contrôler très finement le schéma des documents XML générés par la sérialisation.
  Discussion forum
16 commentaires
  • zax-tfh
    Membre averti
    Excellent tuto !
    pdf aussitot enregistré dans mes documents
    Merci !
  • roster
    Membre averti
    Merci bien!
  • B.AF
    Membre chevronné
    +1 !
  • AJemni
    Membre actif
    Franchement ce Tuto ma beaucoup aider et il m’a clarifié beaucoup d’ambiguité, mais en contre partie, la gestion d’héritage n’était pas trop claire pour moi.

    +1
  • tomlev
    Rédacteur/Modérateur
    Envoyé par AJemni
    mais en contre partie, la gestion d’héritage n’était pas trop claire pour moi.
    En fait, c'est un problème qui n'est pas forcément évident à comprendre si on ne l'a pas déjà rencontré sur un cas concret... En tous cas, si tu veux des éclaircissements là-dessus, n'hésite pas à demander
  • sylvain114d
    Membre du Club
    Très bon article.

    Une petite remarque cependant à propos de l'attribut Flags sur l'énumération :
    Remarquez l'attribut Flags sur l'énumération : il indique que les valeurs peuvent être combinées par un OU binaire (opérateur |). Cet attribut n'est habituellement pas obligatoire, mais il l'est dès lors qu'on veut sérialiser cette énumération en XML. Si l'attribut Flags n'est pas présent, une exception sera levée si on cherche à sérialiser une valeur qui ne fait pas explicitement partie de l'énumération.
    J'ai essayé de mettre ou supprimer l'attribut Flags au dessus de mon enum et cela n'a rien changé : j'ai quand même une exception lorsque je sérialise une valeur en dehors de l'enum.
    J'ai fait mes tests en .Net 2.0. Peut-être cela est-il différent pour les nouvelles versions mais cela m'étonnerais.
  • tomlev
    Rédacteur/Modérateur
    Envoyé par sylvain114d
    J'ai fait mes tests en .Net 2.0. Peut-être cela est-il différent pour les nouvelles versions mais cela m'étonnerais.
    Bizarre... peux-tu montrer le code qui pose problème ?
    (par contre je pars en WE donc je ne pourrai pas regarder avant dimanche soir)
  • sylvain114d
    Membre du Club
    J'ai une exception lors de la sérialisation :

    Code :
    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
        [Flags]
        public enum AddressType
        {
            None = 0,
            Ship = 1,
            Bill = 2
        }
    
        public class Address
        {
            [XmlElement("TypeAdresse")]
            public AddressType Type;
            public string AdrLine1;
        }
    
        class XMLSerialTest
        {
            public static void Test()
            {
                Address a1 = new Address();
                a1.Type = (AddressType)10;
                a1.AdrLine1 = "Hello World!";
    
                XmlSerializer xs = new XmlSerializer(typeof(Address));
                using (StreamWriter wr = new StreamWriter("c:\\test.xml"))
                {
                    xs.Serialize(wr, a1);
                }
                using (StreamReader rd = new StreamReader("c:\\test.xml"))
                {
                    Address a2 = xs.Deserialize(rd) as Address;
                    Console.WriteLine("Type : " + a2.Type);
                    Console.WriteLine("Line1 : " + a2.AdrLine1);
                }
            }
        }
  • tomlev
    Rédacteur/Modérateur
    Le problème est ici :

    Code :
    a1.Type = (AddressType)10;
    10 n'est pas une valeur valide de AddressType. Ca ne correspond à aucune combinaison de valeurs de AddressType... On peut sérialiser des valeurs qui ne font pas explicitement partie de l'enumération, mais il faut quand même que ce soit une combinaison de valeurs existantes...
  • sylvain114d
    Membre du Club
    OK merci.
    Donc la sérialisation XML d'une enum avec l'attribut Flags fonctionne de façon intuitive et cohérente avec le reste du framework.
    Dans ton article j'avais l'impression que l'attribut Flags avait un comportement spécial lors de sérialisation XML.

    Les phrases :

    Cet attribut n'est habituellement pas obligatoire, mais il l'est dès lors qu'on veut sérialiser cette énumération en XML.
    et

    Si l'attribut Flags n'est pas présent, une exception sera levée si on cherche à sérialiser une valeur qui ne fait pas explicitement partie de l'énumération.
    m'ont induit en erreur.