Sérialiser/désérialiser plusieurs classes

Résolu
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 - 4 juil. 2012 à 15:42
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 - 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

 

23 réponses

LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
16 juil. 2012 à 16:19
salut

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


 
0
LaTatadu91 Messages postés 968 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
16 juil. 2012 à 16:38
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 :(
 
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
16 juil. 2012 à 18:21
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
0
Rejoignez-nous