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 :

désérialisation XML élément non attendu


Sujet :

C#

  1. #1
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut désérialisation XML élément non attendu
    Salut à tous,

    allez je poste !
    Moi aussi je veux poser des questions !!!

    j'ai, dans une classe abstraite, le code suivant :
    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
    43
    44
    45
    46
            /// <summary>
            /// Sérialise le personnage en XML.
            /// </summary>
            /// <returns>Retourne le nom qualifié complet du fichier écrit.</returns>
            public string Save()
            {
                string fileFullName = null;
                string folderPath = Properties.Settings.Default.XmlCharacterFolderPath;
    
                DirectoryInfo dinf = new DirectoryInfo(folderPath);
                if (!dinf.Exists)
                    dinf.Create();
    
                if (string.IsNullOrEmpty(this.GeneralInformations.Name))
                    throw new SavingCharacterWithoutNameException();
    
                XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                ns.Add("", "");
                XmlSerializer xs = new XmlSerializer(this.GetType());
                fileFullName = Path.Combine(folderPath, string.Concat(this.GeneralInformations.Name, ".xml"));
                using (StreamWriter wr = new StreamWriter(fileFullName))
                    xs.Serialize(wr, this, ns);
    
                return fileFullName;
            }
    
            /// <summary>
            /// Désérialise le personnage depuis un fichier XML.
            /// </summary>
            /// <param name="fileFullName">Nom complet qualifié du fichier XML contenant le personnage.</param>
            /// <returns>Retourne une instance de BaseAdventurer représentant le personnage.</returns>
            public static BaseAdventurer Load(string fileFullName)
            {
                if (string.IsNullOrEmpty(fileFullName))
                    throw new ArgumentNullException("fileFullName");
    
                FileInfo finf = new FileInfo(fileFullName);
                if (!finf.Exists)
                    throw new ArgumentException("Fichier introuvable", fileFullName);
    
                BaseAdventurer p = null;
                XmlSerializer xs = new XmlSerializer(typeof(BaseAdventurer));
                using (StreamReader rd = new StreamReader(fileFullName))
                    p = xs.Deserialize(rd) as BaseAdventurer;
                return p;
            }
    Le début de mon fichier XML est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      <?xml version="1.0" encoding="utf-8" ?> 
    - <Assassin>
      <HitPoints>13</HitPoints> 
      <CurrentHPs>13</CurrentHPs>
    et quand je joue la méthode Load, j'ai une exception sur la ligne en rouge:
    Le message est 'il y a une erreur dans le fichier xml (2,2)... soit, je regarde l'innerException pour en savoir plus et il me dit :
    <Assassin xmlns=''> n'était pas attendu

    pour compléter :
    ma classe abstraite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        [Serializable, XmlInclude(typeof(BattleSoul)), XmlInclude(typeof(Killer)), XmlInclude(typeof(Ranger)), XmlInclude(typeof(Knight)), XmlInclude(typeof(Elementalist)), XmlInclude(typeof(Warrior)), XmlInclude(typeof(Wizard)), XmlInclude(typeof(Priest))]
        public abstract class BaseAdventurer : BaseCreature
    et
    une classe en dérivant (en pasant par d'autres)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        [XmlRoot("Assassin")]
        public sealed class Killer : BaseWarrior, IShadow
    j'ai beau me triturer les neurones, je ne trouve pas... je suis sûre que c('est un truc à deux balles en plus. Pour le coup, j'ai besoin d'un chien guide d'aveugle pour mettre la truffe (moi) sur l'erreur...

    Merci

  2. #2
    Membre éclairé Avatar de cs_ntd
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2006
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 598
    Par défaut
    Bin j'ai pas regardé le code à fond, ya rien qui m'a choqué. Par contre le fichier XML lui oui : si c'est vraiment ça ton fichier, et bien il est pas valide : il manque la balise </Assassin> pour rendre le fichier pleinement valide.
    Il n'y aurait rien de choquant que le parser soulève une erreur à cause de ça !

  3. #3
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut
    Le fichier est bien valide. Je n'ai mis que le début du XML...

    Et oui, il n'y a rien de choquant... c'est bien là mon problème. Je n'arrive pas à situer où se trouve l'erreur.

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Pourquoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ?

  5. #5
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut
    j'ai vu ça dans le tuto de Tomlev... Cependant, même si je supprime ce code, celà ne change rien.

  6. #6
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut
    J'ai trouvé d'où vient l'erreur :
    code de sérialisation :
    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
                string fileFullName = null;
                string folderPath = Properties.Settings.Default.XmlCharacterFolderPath;
     
                DirectoryInfo dinf = new DirectoryInfo(folderPath);
                if (!dinf.Exists)
                    dinf.Create();
     
                if (string.IsNullOrEmpty(this.GeneralInformations.Name))
                    throw new SavingCharacterWithoutNameException();
     
                XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                ns.Add("", "");
                //XmlSerializer xs = new XmlSerializer(this.GetType());
                XmlSerializer xs = new XmlSerializer(typeof(BaseAdventurer));
                fileFullName = Path.Combine(folderPath, string.Concat(this.GeneralInformations.Name, ".xml"));
                using (StreamWriter wr = new StreamWriter(fileFullName))
                    xs.Serialize(wr, this, ns);
     
                return fileFullName;
    l'erreur vient de la ligne commentée

    et la désérialisation :
    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
            public static BaseAdventurer Load(string fileFullName)
            {
                if (string.IsNullOrEmpty(fileFullName))
                    throw new ArgumentNullException("fileFullName");
     
                FileInfo finf = new FileInfo(fileFullName);
                if (!finf.Exists)
                    throw new ArgumentException("Fichier introuvable", fileFullName);
     
                BaseAdventurer p = null;
                XmlSerializer xs = new XmlSerializer(typeof(BaseAdventurer));
                using (StreamReader rd = new StreamReader(fileFullName))
                    p = xs.Deserialize(rd) as BaseAdventurer;
     
                return p;
            }
    le problème, c'est que maintenant j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="utf-8"?>
    <BaseAdventurer d1p1:type="Killer" xmlns:d1p1="http://www.w3.org/2001/XMLSchema-instance">
      <HitPoints>11</HitPoints>
      <CurrentHPs>11</CurrentHPs>
    [...]
    et je cherche à obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="utf-8"?>
    <Assassin>
      <HitPoints>11</HitPoints>
      <CurrentHPs>11</CurrentHPs>
    [...]
    en mettant la ligne de code pour dégager le xmlns et l'attribut xmlroot à ma classe enfant, ça ne me donne pas le xml attendu.

    bien évidemment, dans le cadre de ce jeu, j'ai d'autres classes comme le chevalier sérialisé (je le souhaite) comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="utf-8"?>
    <Chevalier>
      <HitPoints>11</HitPoints>
      <CurrentHPs>11</CurrentHPs>
    [...]
    C'était la raison pour laquelle je mettais cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XmlSerializer xs = new XmlSerializer(this.GetType());
    .
    pour la désérialisation, le type est inconnu donc je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     XmlSerializer xs = new XmlSerializer(typeof(BaseAdventurer));
    ...
    si je pouvais faire en sorte qu'il trouve le bon type tout seul...

    Donc, si des personnes très douées en sérialisations avaient une idée...

  7. #7
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut
    Personne n'a d'idée ? Pas même Tomlev, auteur de mon article de référence sur la sérialisation xml ?

    Dans ce cas, je me contenterais de ce qui fonctionne, mais n'est pas beau et j'investiguerai plus tard.

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

Discussions similaires

  1. [iText][XML] Police non reconnue
    Par mezoo dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 27/04/2006, 09h48
  2. Télécharger un fichier XML et non l'ouvrir
    Par BouB dans le forum Langage
    Réponses: 4
    Dernier message: 21/03/2006, 19h37
  3. Erreur d'analyse XML : entité non définie
    Par ToxiZz dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 16/01/2006, 13h22
  4. Réponses: 6
    Dernier message: 13/12/2005, 15h00
  5. [HashSet] élément non unique
    Par Wookai dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 02/08/2005, 17h17

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