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 :

erreur référence d'objet avec Deserialization XML


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2016
    Messages : 22
    Par défaut erreur référence d'objet avec Deserialization XML
    Hello tout le monde!
    Merci d'avance de prendre du temps pour lire

    Je suis en train de programmer un WPF en C# avec visual studio.

    J'ai un fichier nommé config.xml pour la config par défaut qui me permettra de tracer des courbes plus tard.
    Je désérialize mon fichier en un objet de classe Config, et pour l'instant je souhaiterai juste afficher des propriété en texte (nom et IP), le problème étant qu'il me lève une exception comme quoi il ne serait pas définit comme référence à un objet donc il ne veut pas que j’accède aux propriétés.

    Les classe XML (Config, Appareil et WSREST) ont été généré grâce à xml2Csharp:
    http://xmltocsharp.azurewebsites.net/

    Juste a mettre la chaîne XML et il génère les classe. Ensuite il suffit de recevoir une chaîne xml et de la deserializer avec la classe XmlSerializer qui convertie la chaîne en objet.

    Le code suivant lit le fichier XML, le deserialize en objet de classe Config qui possède une propriété de classe WSREST et une autre de classe DefaultAppareil:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public static Config ReadConfig()
            {
                Config maConfig;
                XmlSerializer serializer = new XmlSerializer(typeof(Config));
     
                using (XmlReader reader = XmlReader.Create("..\\..\\config.xml"))
                { maConfig = serializer.Deserialize(reader) as Config; }
     
                return maConfig;
            }

    L'erreur est levé par la ligne en gras:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public partial class MainWindow : Window
        {
            private Config currentConfig = new Config();
            
            public MainWindow()
            {
                //Lit le fichier config.xml et assigne l'objet à la propriété de la fenêtre WPF
                this.currentConfig = Configuration.ReadConfig();
    
         //TextBox sur la fenêtre WPF
                this.NomSBoard.Content = this.currentConfig.SBoard.Nom + " (" + this.currentConfig.SBoard.Ip + ")";
    
                InitializeComponent();
            }


    Voici les 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
    [XmlRoot(ElementName = "Config")]
        public class Config
        {
            [XmlElement(ElementName = "WSREST")]
            public WSREST WSREST { get; set; }
            [XmlElement(ElementName = "defaultSBoard")]
            public DefaultSBoard SBoard { get; set; }
        }
     
        [XmlRoot(ElementName = "WSREST")]
        public class WSREST
        {
            [XmlAttribute(AttributeName = "ip")]
            public string Ip { get; set; }
        }
     
     
        [XmlRoot(ElementName = "S-Board")]
        public class DefaultSBoard
        {
            [XmlElement(ElementName = "Nom")]
            public string Nom { get ; set; }
            [XmlElement(ElementName = "Courbe")]
            public string Courbe { get; set; }
            [XmlElement(ElementName = "NbDerniereValeur")]
            public string NbDerniereValeur { get; set; }
            [XmlAttribute(AttributeName = "ip")]
            public string Ip { get; set; }
        }
    Dans mon code XmlRoot et XmlElement sont coloré en bleu/vert (coloration des nom de classe) grâce à ce using: using System.Xml.Serialization;


    Merci pour votre aide

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    L'exception est levé par 'this.currentConfig.SBoard.Nom' ou par 'this.currentConfig.SBoard.Ip' ?
    Que vaut la valeur du champ qui lève l'exception après 'ReadConfig()' ?

    Quelques questions qui devraient te permettre de résoudre ton problème.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2016
    Messages : 22
    Par défaut
    Pour les 2 c'est pareil, comme pour Visual la propriété SBoard de CurrentConfig n'est pas un objet il n'a pas de propriété donc impossible d'accéder a SBoard.Nom ou Sboard.Ip
    Apres la fonction ReadConfig() toutes les propriété et sous propriété de currentConfig sont bien assigné:
    -this.currentConfig
    --SBoard
    ---Courbe: "temperature"
    ---Ip: "10.1.1.116
    ---NbDerniereVal: "30"
    ---Nom: "S-Board-test"
    --WREST
    ---ip : "localhost"

    J'ai essayer en rajouter une fonction Get dans la classe DefaultSBoard ca marche pas, la même erreur. Je pense qu'il veux un new quelque part pour instancier un objet de classe DefaultSBoard puis l'assigné à la propriété currentConfig.SBoard

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    D'après les valeurs que tu me donne il à l'air initialisé, d’ailleurs je ne sais pas comment.

    Excuse moi mais ton code 'Voici les classe' n'est pas bien balisé, il n'est donc pas très lisible.
    Je l'ai simplifier uniquement pour la lecture. Donc voici comment instancier tes 2 classes 'WSREST' et 'DefaultSBoard' dans le constructeur de 'Config'

    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
            private void button1_Click(object sender, EventArgs e)
            {
                Config C = new Config();
            }
     
            public class Config
            {
                public WSREST WSREST { get; set; }
                public DefaultSBoard SBoard { get; set; }
     
                public Config()
                {
                    WSREST = new WSREST();
                    SBoard = new DefaultSBoard();
                }
            }
     
            public class WSREST
            {
                public string Ip { get; set; }
            }
     
            public class DefaultSBoard
            {
                public string Nom { get; set; }
                public string Courbe { get; set; }
                public string NbDerniereValeur { get; set; }
                public string Ip { get; set; }
            }
    Tu peux aussi essayer de décomposer le problème (est ce la lecture ou l’écriture qui pose problème ?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string test = this.currentConfig.SBoard.Nom + " (" + this.currentConfig.SBoard.Ip + ")";

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2016
    Messages : 22
    Par défaut
    Désolé pour les classes, c'est arrangé!


    Alors comment dire.. J'ai trouver le problème!
    Je faisais tous mes trucs avant le InitializeComponent() du constructeur de la fenetre, donc la Label NomSBoard n'existait pas.. Et c'est pour ça qu'il gueulait, pas pour mes classes! -_-
    Sinon les constructeur ne sont pas obligatoire dans les classes XML.

    Merci quand même, et désolé pour cette erreur totalement débile..

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

Discussions similaires

  1. [Débutant] Erreur référence d'objet requise
    Par paul86 dans le forum C#
    Réponses: 1
    Dernier message: 17/03/2012, 20h10
  2. Mappage objet avec flux XML
    Par REMACC1 dans le forum C#
    Réponses: 0
    Dernier message: 04/08/2009, 16h39
  3. Réponses: 2
    Dernier message: 04/03/2009, 12h08
  4. Erreur lors du marshalling d'une grappe d'objet avec Castor XML
    Par mbinte dans le forum Persistance des données
    Réponses: 2
    Dernier message: 29/08/2008, 17h07
  5. [SimpleXML] erreur avec simple XML sur le constructeur
    Par zulot dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 20/04/2007, 16h06

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