locked
Problem Serialization RRS feed

  • Question

  • Hello all,

    I have a instance of Partie that I want to serialize thanks to this method :

    public void sauvegarder(string p)
            {
                IFormatter formatter = new BinaryFormatter();
                Stream stream = new FileStream(p, FileMode.Create, FileAccess.Write, FileShare.None);
                formatter.Serialize(stream,this);
                stream.Close();
            }

    But I get an error during the execution : 

    Type 'WPF_Civilisation.Window_Carte' in Assembly 'WPF_Civilisation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

    Below my class Partie which has not an instance of  Window_Carte...

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Collections;
    using Civilisation_code.PJoueur;
    using Civilisation_code.PCarte;
    using System.ComponentModel;
    using System.Runtime.Serialization;
    using System.IO;
    using System.Runtime.Serialization.Formatters.Binary;
    
    namespace Civilisation_code.PPartie
    {
        /// <summary>
        /// Classe Partie contenant toutes les informations de la partie
        /// </summary>
        /// <remarks>
        /// Produit dans le patron de conception Monteur
        /// </remarks>
        [Serializable]
        public class Partie : INotifyPropertyChanged
        {
    
            public event PropertyChangedEventHandler PropertyChanged;
            private void OnPropertyChanged(string name)
            {
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
    
            /// <summary>
            /// Numéro du joueur actif
            /// </summary>
            private int _numJoueurActif;
            public int NumJoueurActif
            {
                get
                {
                    return _numJoueurActif;
                }
                set
                {
                    _numJoueurActif = value;
                    OnPropertyChanged("joueur_actif");
    
                }
            }
    
            /// <summary>
            /// Liste des joueurs actifs
            /// </summary>
            public List<Joueur> _joueurs { set; get; }
    
            /// <summary>
            /// Carte de la partie
            /// </summary>
            public Carte _carte { set; get; }  
    
            /// <summary>
            /// Constructeur
            /// </summary>
            public Partie()
            {
                //Initialisation
                _joueurs = new List<Joueur>();
                NumJoueurActif = 0;
            }
    
            /// <summary>
            /// Récupération du joueur actif
            /// </summary>
            /// <returns>Joueur actif</returns>
            public Joueur getJoueurActif()
            {
                return _joueurs[NumJoueurActif]; 
            }
            /// <summary>
            /// Ajout d'un joueur dans la partie
            /// </summary>
            /// <param name="j">Joueur à ajouter</param>
            public void addJoueur(Joueur j){
                   _joueurs.Add(j);
            }
    
            /// <summary>
            /// Met à jour le numéro du joueur actif et lance le traitement de nouveau tour du joueur
            /// </summary>
            public void joueurSuivant()
            {
    
                NumJoueurActif = (NumJoueurActif + 1) % _joueurs.Count;
    
                _joueurs[NumJoueurActif].nouveauTour();
            }
    
    
            public void debut()
            {
                NumJoueurActif = 0;
                _joueurs[NumJoueurActif].nouveauTour();
            }
    
            public void sauvegarder(string p)
            {
                IFormatter formatter = new BinaryFormatter();
                Stream stream = new FileStream(p, FileMode.Create, FileAccess.Write, FileShare.None);
                formatter.Serialize(stream,this);
                stream.Close();
            }
        }
    }

    Thank you for advance.




    • Edited by TWEESTY Thursday, January 3, 2013 10:40 AM
    Thursday, January 3, 2013 10:30 AM

Answers

  • Try adding the [field: NonSerialized] attribute to the PropertyChangedEventHandler event, maybe Window_Carte has attached a handle to this even and the serialization code tries to serialize it.
    • Marked as answer by TWEESTY Thursday, January 3, 2013 3:36 PM
    Thursday, January 3, 2013 10:44 AM

All replies

  • Try adding the [field: NonSerialized] attribute to the PropertyChangedEventHandler event, maybe Window_Carte has attached a handle to this even and the serialization code tries to serialize it.
    • Marked as answer by TWEESTY Thursday, January 3, 2013 3:36 PM
    Thursday, January 3, 2013 10:44 AM
  • Thanks a lot! It works ;) 
    Thursday, January 3, 2013 3:36 PM