Sérialisation d'une classe

Messages postés
51
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
28 septembre 2019
- - Dernière réponse : Whismeril
Messages postés
13821
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 octobre 2019
- 14 juin 2019 à 17:53
Bonjour,

J'essaye de sérialiser les données d'un document ListEp dans BiblioEpisode ( une classe qui contient une liste d'épisode), une erreur du type : "System.ArgumentNullException : 'La valeur ne peut pas être null.
Nom du paramètre : value'" survient pour mon numéro d'épisode et mon bool Etat. Je ne voit pas comment corriger cette faute car j'ai fait des rechercher et je n'ai trouvé que la fonction
            NumEpisode = reader.ReadElementContentAsInt("numEpisode", ""); 

Comme ça fonctionnait pas j'ai tenter
NumEpisode = int.Parse(reader["numEpisode"]);
mais l'erreur reste ... Pourriez vous m'aider s'il vous plait ?
Merci d'avance pour vos réponses.

Voici les détail du code :

Dans la classe Episode:


   public class Episode : Identification, IDataErrorInfo, INotifyPropertyChanged, IXmlSerializable
    {

// pour que le code soit plus léger, je ne met pas les constructeur ....


        public XmlSchema GetSchema()
        {
            throw new NotImplementedException();
        }

        public void ReadXml(XmlReader reader)
        {
            //NumEpisode = reader.ReadElementContentAsInt("numEpisode", "");
            //NumEpisode = int.Parse(reader["numEpisode"]);
            reader.ReadToFollowing("date");
            Nom = reader["nom"];
            IdSaison = reader["idSaison"];
            IdSerie = reader["idSerie"];
            Video = reader["video"];
            Etat = bool.Parse(reader["etat"]);
        }

        public void WriteXml(XmlWriter writer)
        {
            writer.WriteElementString("numEpisode", NumEpisode.ToString());
            writer.WriteElementString("nom", Nom.ToString());
            writer.WriteElementString("idSerie", IdSerie.ToString());
            writer.WriteElementString("idSaison", IdSaison.ToString());
            writer.WriteElementString("video", Video.ToString());
            writer.WriteElementString("etat", Etat.ToString());

        }









Dans la classe XMLCreationSauvegarde

   public class XMLCreationSauvegarde : IPersistanceEpisode
    {
        public ObservableCollection<Episode> ListEp()
        {
            XmlSerializer BiblioEpisode = new XmlSerializer(typeof(ObservableCollection<Episode>));

            ObservableCollection<Episode> BiblioEpisode1;

            //désérialisation
            using (Stream stream = File.OpenRead("ListEp.xml"))
            {
                BiblioEpisode1 = BiblioEpisode.Deserialize(stream) as ObservableCollection<Episode>;
            }
            return BiblioEpisode1;
        }

        public void SauvegardeBiblioEpisode(ObservableCollection<Episode> listEp)
        {
            XmlSerializer BiblioEpisode1 = new XmlSerializer(typeof(ObservableCollection<Episode>));

            //sérialisation
            using (Stream stream = File.Create("ListEp.xml"))
            {
                BiblioEpisode1.Serialize(stream, listEp);
            }
        }







L'interface IPersistanceEpisode


    public interface IPersistanceEpisode
    {
        ObservableCollection<Episode> ListEp();

        void SauvegardeBiblioEpisode(ObservableCollection<Episode> ListEp);


    }






    public class BiblioEpisode : INotifyPropertyChanged
    {
        public BiblioEpisode()
        {
            ListEpisodes = GetAll();
        }

        public ObservableCollection<Episode> ListEpisodes { get; set; }






    public class Manager

        //Voici la classe Manager, cette dernier permet de gérer l'ensempble des fonctionnalité de l'application sans que l'utilisateur n'est besoin d'appeller directement les méthose depuis le projet biblioDeClasse
    {
        private XMLCreationSauvegarde xMLCreationSauvegarde;

        BiblioSaison BiblioSaison { get; set; } = new BiblioSaison();

        BiblioEpisode BiblioEpisode { get; set; } = new BiblioEpisode();

        Utilisateur Utilisateur { get; set; }
        IPersistanceUtilisateur PersistanceU { get; set; }
        IPersistanceEpisode PersistanceE { get; set; }
        IPersistanceSerie PersistanceS { get; set; }

//ici les persistance U et S ne sont pas utiliser

        public Manager (IPersistanceEpisode persistanceE, IPersistanceSerie persistanceS, IPersistanceUtilisateur persistanceU)
        {
            this.PersistanceE = persistanceE;
            this.PersistanceU = persistanceU;
            this.PersistanceS = persistanceS;

        }

        public Manager(XMLCreationSauvegarde xMLCreationSauvegarde)
        {
            this.xMLCreationSauvegarde = xMLCreationSauvegarde;
        }

        public void SauvegarderEpisode(ObservableCollection<Episode> ListEp)
        {
            IPersistanceEpisode persistanceEpisode = new XMLCreationSauvegarde();
            persistanceEpisode.SauvegardeBiblioEpisode(ListEp);

        }

        public ObservableCollection<Episode> LireListeEpisode()
        {
            return BiblioEpisode.ListEpisodes=PersistanceE.ListEp();
        }

}



dans App.xaml

    public partial class App : Application
    {


        private static readonly IPersistanceEpisode persistanceE = new XMLCreationSauvegarde();
        private static readonly IPersistanceSerie persistanceS = new XMLCreationSauvegarde();
        private static readonly IPersistanceUtilisateur persistanceU = new XMLCreationSauvegarde();


        //public Manager.Manager Manager = new Manager.Manager(new StubEpisode(), persistanceS, persistanceU);
        public Manager.Manager Manager = new Manager.Manager(persistanceE, persistanceS, persistanceU);
    }

}





Dans le code C# de la window ou je chage la bibliothèque pour travailler dessus :

 public Episode_Grey_Anatomy()
        { 
            InitializeComponent();
            DataContext = this;
            BiblioEpisode.ListEpisodes = Manager.LireListeEpisode();
        }


        public Manager.Manager Manager
        {
            get { return (App.Current as App).Manager; }
        }
    

Afficher la suite 

1 réponse

Messages postés
13821
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
15 octobre 2019
401
0
Merci
Bonjour
Je n’ai pas répondu jusque-là car je n’aime pas xmlserializer.
En effet, j’ai été confronté à des erreurs comme toi, et n’arrivant pas à m’en défaire, j’ai cherché une autre méthode.
Depuis j’utilise linq to xml.
Voici un petit tutoriel que j’ai écrit à ce sujet.
https://codes-sources.commentcamarche.net/faq/11196-linq-to-xml-c-et-vb-net

Si tu décides de changer pour linq to xml, je pourrais t’aider.


Commenter la réponse de Whismeril