Sérialiser/désérialiser plusieurs classes [Résolu]

Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
- - Dernière réponse : Whismeril
Messages postés
13731
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 septembre 2019
- 16 juil. 2012 à 18:21
Bonjour,

débutant en C# j'ai trouvé un tuto sympa pour sérialiser en XML une classe et toutes ses propriétés.
exemple type: une listview affichant des contacts (nom, prenom, tel, adresse)
une list de contacts et hop on sérialise l'objet contact_list

dans mon cas précis j'utilise plusieurs classes, dans différents form
et je souhaite lorsque l'utilisateur ferme l'appli pouvoir sauvegarder toutes les données
et lui permettre de les charger au démarrage.
il faut donc que je sérialise différentes classes .
comment est ce possible? et en un seul fichier XML pour éviter de serialiser 5/6 fois.
d'ailleurs est-ce possible?

merci

 
Afficher la suite 

3/23 réponses

Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
0
Merci
salut

pour ma classe globale, suis je obligé d'utiliser des listes? vu que je n'ai qu'un enregistrement à chaque fois?


 
Commenter la réponse de LaTatadu91
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
0
Merci
En fait ça marche aps avec une classe globale
j'ai fait ça:
 [Serializable]
    public class GlobalClass
    {
         List<WasteGasComposition> listeWG;
         //List<DataBalance> listeDataBalance;

        public List<WasteGasComposition> ListeWG
        {
            get { return listeWG; }
            set { listeWG = value; }
        }

        //public List<DataBalance> ListeDataBalance
        //{
        //    get { return listeDataBalance; }
        //    set { listeDataBalance = value; }
        //}

        public GlobalClass()
        {
            listeWG = new List<WasteGasComposition>();
            //listeDataBalance = new List<DataBalance>();
        }

        public void Save(string filename)
        {
            FileStream file = File.Open(filename, FileMode.OpenOrCreate);
            XmlSerializer serializer = new XmlSerializer(typeof(GlobalClass));
            serializer.Serialize(file, this);
            file.Close();
        }

        public GlobalClass Load(string filename)
        {
            FileStream file = File.Open(filename, FileMode.Open);
            XmlSerializer serializer = new XmlSerializer(typeof(GlobalClass));
            GlobalClass uneListGlobale = (GlobalClass)serializer.Deserialize(file);
            file.Close();
            return uneListGlobale;
        }
    }

le reste du code n'a aps changé
ça ne marche aps, mon fichier xml est vide
la liste est vide :(
 
Commenter la réponse de LaTatadu91
Messages postés
13731
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 septembre 2019
302
0
Merci
Bonsoir,

pour moi les méthodes de serialization et de deserialization n'ont pas a être dans les classes métiers.

J'ai remodelé comme ça:
    [Serializable]
    public class WasteGasComposition
    {
        public static double o2;
        public static double co2;
        public static double h2o;
        public static double so2;
        public static double n2;
        public static double ar;

        public double O2
        {
            get { return o2; }
            set { o2 = value; }
        }
        public double CO2
        {
            get { return co2; }
            set { co2 = value; }
        }
        public double H2O
        {
            get { return h2o; }
            set { h2o = value; }
        }
        public double SO2
        {
            get { return so2; }
            set { so2 = value; }
        }
        public double N2
        {
            get { return n2; }
            set { n2 = value; }
        }
        public double Ar
        {
            get { return ar; }
            set { ar = value; }
        }
    }


    [Serializable]
    public class GlobalClass
    {

        List<WasteGasComposition> listeWG;
        List<DataBalance> listeDataBalance;

        public List<WasteGasComposition> ListeWG
        {
            get { return listeWG; }
            set { listeWG = value; }
        }

        public List<DataBalance> ListeDataBalance
        {
            get { return listeDataBalance; }
            set { listeDataBalance = value; }
        }

        public GlobalClass()
        {
            listeWG = new List<WasteGasComposition>();
            listeDataBalance = new List<DataBalance>();
        }
    }




J'ai "inventé" la 2eme classe pour le test:

    [Serializable]
    public class DataBalance
    {
        public DataBalance()//il faut mettre un constructeur sans paramètres sinon XmlTextReader beugue
        {
        }

        public int int1 { get; set; }

        public int int2 { get; set; }
    }



et dans mon formulaire j'ai mis ces 3 méthodes:

        private void essaiLaTataDu91()
        {
            GlobalClass monGlobal = new GlobalClass();
            //j'initialise mes listes directement dans monglobal pour gagner 2 lignes pour l'exemple
            monGlobal.ListeWG.Add(new WasteGasComposition { Ar 1.0, CO2 11.0, H2O = 12.0, N2 = 13.0, O2 = 14.0, SO2 = 15.0 });
            monGlobal.ListeWG.Add(new WasteGasComposition { Ar 2.0, CO2 12.0, H2O = 13.0, N2 = 14.0, O2 = 15.0, SO2 = 16.0 });
            monGlobal.ListeWG.Add(new WasteGasComposition { Ar 3.0, CO2 13.0, H2O = 14.0, N2 = 15.0, O2 = 16.0, SO2 = 17.0 });
            
            monGlobal.ListeDataBalance.Add(new DataBalance { int1 1, int2 2 });
            monGlobal.ListeDataBalance.Add(new DataBalance { int1 2, int2 3 });
            monGlobal.ListeDataBalance.Add(new DataBalance { int1 3, int2 4 });
            
            //je serialize dans le répertoire Bin du projet
            serializeGlobal(monGlobal);
            
            //je déserialize un nouvel objet identique au 1er
            GlobalClass monGlobal2 = DeserializationGlobal();

        }

        private void serializeGlobal(GlobalClass monGlobal)
        {
            using (FileStream fs = new FileStream("toto.xml", FileMode.Create))
            {
                XmlSerializer xSer = new XmlSerializer(monGlobal.GetType());
                xSer.Serialize(fs, monGlobal);
                xSer = null;
            }

        }

        private GlobalClass DeserializationGlobal()
        {

            XmlSerializer x = new XmlSerializer(typeof(GlobalClass));
            FileStream fs = new FileStream("toto.xml", FileMode.Open);
            XmlReader reader = new XmlTextReader(fs);

            object MonObjet = x.Deserialize(reader);

            x = null;
            fs = null;
            reader = null;

            return (GlobalClass)MonObjet;
        }


et ça marche.
Whismeril
Commenter la réponse de Whismeril