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

 .NET Discussion :

probleme singleton serialisation


Sujet :

.NET

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 144
    Points : 110
    Points
    110
    Par défaut probleme singleton serialisation
    Bonsoir a tous,
    je veux utiliser une classe qui ne peut s'instancier qu'une fois et qui soit thread-safe.
    De plus je veux pouvoir la serialiser dans un fichier et la deserialiser.
    La serialiser ne me pose pas de probleme par contre pour la deserialiser ca me pose probleme.
    voici la definition de ma classe:
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
        [Serializable()]
        public class BlackList : ISerializable
        {
            //Variables
            public List<BlackListNumber> ListBlackListNumber { get; set; }
            static readonly BlackList instance = new BlackList();
            public static BlackList Instance { get { return instance; } }
            //Constructeurs
            private BlackList() { ListBlackListNumber = new List<BlackListNumber>(); }
            //Methodes
            public static void writeObject(string path,BlackList ObjectToSerialize)
            {
                Stream stream = File.Open(path, FileMode.Create);
                BinaryFormatter bformatter = new BinaryFormatter();
                bformatter.Serialize(stream, ObjectToSerialize);
                stream.Close();
            }
            public void writeObject(string path)
            {
                Stream stream = File.Open(path, FileMode.Create);
                BinaryFormatter bformatter = new BinaryFormatter();
                bformatter.Serialize(stream, this);
                stream.Close();
            }
            public static BlackList ReadObject(string path)
            {
                Stream stream = File.Open(path, FileMode.Open);
                BinaryFormatter bformatter = new BinaryFormatter();
                BlackList retour;
                retour = (BlackList)bformatter.Deserialize(stream);
                stream.Close();
                return retour;
            }
            public override string ToString()
            {
                string retour = "";
    
                var e = this.ListBlackListNumber.GetEnumerator();
                while (e.MoveNext())
                {
                    retour += e.Current.ToString() + "\n";
                }
                return retour;
            }
    
            //Imlementation interfaces
            #region ISerializable Membres
    
            public void GetObjectData(SerializationInfo info, StreamingContext context)
            {
                info.AddValue("ListBlackListNumber", this.ListBlackListNumber);
                info.AddValue("instance", instance);
            }
    
            #endregion
    
            public BlackList(SerializationInfo info, StreamingContext context)
            {
                this.ListBlackListNumber = (List<BlackListNumber>)info.GetValue("ListBlackListNumber", typeof(List<BlackListNumber>));
                instance = (BlackList)info.GetValue("instance", typeof(BlackList));
            }
        }
    il me dit que :
    Erreur1 Un champ readonly statique ne peut pas être assigné (sauf s'il appartient à un constructeur statique ou un initialiseur de variable) C:\Users\Thomas\Documents\Visual Studio 2008\Projects\BlackListingFunctions\BlackList.cs

  2. #2
    Membre éprouvé Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Points : 1 118
    Points
    1 118
    Par défaut
    salut,

    Va falloir que tu modifie les propriété de ton objet, il est readonly static ce qui veux dire que tu ne pourra pas le modifier une fois instancier. Tu peut en revanche recupéré une autre instance de la blacklist de cette maniere :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public BlackList BlackList(SerializationInfo info, StreamingContext context)
    {
                this.ListBlackListNumber = (List<BlackListNumber>)info.GetValue("ListBlackListNumber", typeof(List<BlackListNumber>));
                return (BlackList)info.GetValue("instance", typeof(BlackList));
    }

    Apres c'est a toi de revoir ta conception et de voir ce que tu va en faire.

    Cordialement.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    ou plus simplement enlever le readonly du champ ...

  4. #4
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 144
    Points : 110
    Points
    110
    Par défaut
    Merci pour les infos

    Par contre, sera-t-il toujours thread-safe?

  5. #5
    Membre éprouvé Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Points : 1 118
    Points
    1 118
    Par défaut
    Non il ne sera plus Thread safe.


    Mais tu peut implementer un vrai pattern Singleton.

    http://www.yoda.arachsys.com/csharp/singleton.html

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    Citation Envoyé par worm83 Voir le message
    Non il ne sera plus Thread safe.


    Mais tu peut implementer un vrai pattern Singleton.

    http://www.yoda.arachsys.com/csharp/singleton.html
    +1
    J'ai souvent fait appel à cet article pour mes implémentations.

    Il aurait peut être thread safe si tu utilisais un constructeur statique.

  7. #7
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 144
    Points : 110
    Points
    110
    Par défaut
    merci pour le site mais j'ai deja regarde,ca me pose probleme en cas de (de)serialisation

  8. #8
    Membre éprouvé Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Points : 1 118
    Points
    1 118
    Par défaut
    Excuse moi, mais qu'est ce qui t as posé problème ??

    Car j'ai déjà sérialise des instance "singleton" (d'ailleurs en ce moment je bosse sur ça) et ça ne m'a jamais posé problème....

  9. #9
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 144
    Points : 110
    Points
    110
    Par défaut
    Sérialiser ma classe dans un fichier ne me pose pas de probleme.
    C'est la désérialiser depuis ce fichier.

    pour que mon singleton soit thread safe il faut utiliser du read-only et ca sa marche pas

  10. #10
    Membre éprouvé Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Points : 1 118
    Points
    1 118
    Par défaut
    En fait il faut que tu encapsule ton objet BlackList dans un espèce de BlackListControler qui lui sera un singleton et qui gerea l'acces à la blackListe

  11. #11
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 144
    Points : 110
    Points
    110
    Par défaut
    ok
    Aurais-tu de la doc sur ca car je ne connais pas

  12. #12
    Membre éprouvé Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Points : 1 118
    Points
    1 118
    Par défaut
    en rentrant je t'ecrit un exemple

  13. #13
    Membre éprouvé Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Points : 1 118
    Points
    1 118
    Par défaut
    re bon je vais essaye de t'expliquer par l'exemple pour que tu voit le principe :

    donc l'idee est la suivante tu fait d'abord une classe BlackListe normale serializable

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [Serializable()]
    public class BlackList
    {
    //Code
    }

    ensuite tu creer ton "manager" qui est singleton et qui va s'occupper d'encapsuler ta classe blacklist et surtout de la concurence des threads


    Code C# : 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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    public class BlackListControler
    {
    private static readonly object SynchInstance = new object();
     
    private static readonly object SynchList = new object();
     
     
    //Encapsulation de la BlackList
    private BlackList _Liste {get; set;}
    public BlackList Liste 
    {
       get
       {
          lock(SynchList)
          {
             return this._Liste;
          }
       }
       set
       {
          lock(SynchList)
          {
             this.Liste= value;
          }
       }
    }
     
    //Instance du controler
    private static BlackListControler _Instance =null;
     
    //Accesseur de l'instance implementation du Singleton
    public static BlackListControler Instance
    {
       get
       {
               lock (SynchInstance)
               {
                    if (BlackListControler._Instance == null)
                       lock (SynchInstance)
                       {
                            BlackListControler._Instance = new BlackListControler();
                        }
                        return BlackListControler._Instance;
                }
       }
    }
     
    //Constructeur privé
    private BlackListeControler()
    {
    //Initialisation des valeur
    this.deserialiseList();
    }
     
    private void deserialiseList()
    {
      //deserialisation
    this.Liste = (BlackList)info.GetValue("instance", typeof(BlackList));
    }
     
     
    }
     
     
    }

    Voila grossièrement ce que j'essaye de t'expliquer.

    Cordialement

    Edit : dure d'ecrire du code un petit peu long la dedans

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

Discussions similaires

  1. probleme JAXB serialisation
    Par yassirjanati dans le forum XML/XSL et SOAP
    Réponses: 0
    Dernier message: 28/09/2011, 16h59
  2. probleme de serialisation
    Par leame dans le forum MFC
    Réponses: 1
    Dernier message: 18/07/2011, 10h28
  3. Probleme de serialisation d'objet
    Par hannibal.76 dans le forum Langage
    Réponses: 2
    Dernier message: 02/07/2010, 18h27
  4. Linq & webservice : probleme de serialisation
    Par boby62423 dans le forum Linq
    Réponses: 1
    Dernier message: 11/04/2009, 18h32
  5. probleme de serialisation
    Par zulad dans le forum C#
    Réponses: 1
    Dernier message: 30/06/2007, 21h44

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