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 :

Deserialisation d'une classe


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Deserialisation d'une classe
    Bonjour

    Je me heurte a un probleme qui m'interpelle car j'ai encore un trou de compréhension qq part

    Je definis une classe et dans son constructeur j'aimerais appeller une methode de désérialisation.
    Mais j'ai le message :

    Cannot assign to '<this>' because it is read-only
    Est ce que cela signifie qu'une classe ne peut pas avoir son propre désérializer et que je suis obligé d'utiliser une methode statique externe ?

    Voici l'exemple, c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this = (C_Algemeen)xs.Deserialize(reader);
    Qui pose problème

    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
     public class C_Algemeen
      {
        public bool[] ForbidDays { get; set; }
        public List<Plage> ForbidTime {get;set;}
     
        public C_Algemeen()
        {
        }
     
        public C_Algemeen(string _file)
        {
           LoadXml(_file);
        }
        public void LoadXml(string FileName)
        {
          if (!File.Exists(FileName))
          {
            return;
          }
          try
          {
            using (StreamReader fs = new StreamReader(FileName))
            {
              XmlReaderSettings xmlSettings = new XmlReaderSettings();
              xmlSettings.CloseInput = true;
              xmlSettings.IgnoreWhitespace = true;
              xmlSettings.ConformanceLevel = ConformanceLevel.Document;
              xmlSettings.CloseInput = false;
              XmlReader reader = XmlReader.Create(fs, xmlSettings);
     
     
              XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
              ns.Add("", "");
              XmlSerializer xs = new XmlSerializer(typeof(C_Algemeen));
              this = (C_Algemeen)xs.Deserialize(reader);
              reader.Close();
              fs.Close();
            }
          }
          catch
          {
          }
          return;
        }
      }

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    this ca représente l'instance actuelle qui execute le code, tu ne peux pas la modifier ca serait un non sens ...

    il suffit de mettre une variable à la place
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    il suffit de mettre une variable à la place
    Mais ca c'est un autre non sens il me semble ?

    Puisque l'idée c'est de charger la classe directement via le constructeur !
    Mettre une variable a la place signifie que je construit une classe intermediaire avec le constructeur par défaut et qu'ensuite je substitue les propriétés de la premiere avec la deuxieme

    Si c'est pour faire ca autant faire une methode statique hors de la classe a qui on passe le fichier Xml et qui construit elle meme la classe

    Mais ca me perturbe un peu d'avoir une methode SaveXml interne a la classe et une methode LoadXml externe

  4. #4
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Tu ne peux pas faire ça ainsi. Comme le dit Pol63 tu ne peux pas modifier this, et encore heureux.

    Mais ca me perturbe un peu d'avoir une methode SaveXml interne a la classe et une methode LoadXml externe
    Il suffit alors d'avoir que les méthodes Load et Save soient toutes les deux externes, dans une classe dédiée à la sérialisation des données. Car la classe que l'on sérialise au final et un bête container de données qui n'a pas besoin de savoir comment on charge ou on sauvegarde les données en question.

  5. #5
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Il suffit alors d'avoir que les méthodes Load et Save soient toutes les deux externes, dans une classe dédiée à la sérialisation des données. Car la classe que l'on sérialise au final et un bête container de données qui n'a pas besoin de savoir comment on charge ou on sauvegarde les données en question.
    Merci StorMimonn
    Oui ca me semble le plus cohérent !

    Néanmoins je trouvais plaisant de tout mettre dans le meme sac par souci de groupage !

    Car si le bête container de données n'a pas besoin de savoir comment on charge ou on sauvegarde les données en question.

    Le developpeur passe souvent a se demander "c'est quoi encore les methodes a employer ???"
    Et quand on les a sous la main avec la classe grace a l'intellisense c'est quand meme sympa !

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 197
    Par défaut
    le mieux serait d'utiliser un design pattern factory

    rentre le constructeur privé pour que personne ne puisse l'appeler
    mettre une fonction static qui retourne une instance de cette classe (qui s'occupe donc de la désérialisation)
    et si d'autres personnes doivent utiliser le code, mettre en aide xml au début de la classe qu'il faut appeler le createur d'instance
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

Discussions similaires

  1. destruction d'une classe qui herite de CDialog
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 03/02/2004, 17h39
  2. Réponses: 14
    Dernier message: 15/01/2004, 01h15
  3. Conception d'une classe parente
    Par VincentB dans le forum Langage
    Réponses: 9
    Dernier message: 24/06/2003, 17h28
  4. Variable d'une Classe Ancêtre
    Par Génie dans le forum Langage
    Réponses: 3
    Dernier message: 18/09/2002, 19h24
  5. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    Réponses: 13
    Dernier message: 03/07/2002, 17h21

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