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

C# Discussion :

Sérialisation et Désérialisation d'une classe static


Sujet :

C#

  1. #1
    Membre éclairé Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Par défaut Sérialisation et Désérialisation d'une classe static
    Bonjour,

    Je cherche à Sérialisé et Désérialisé une classe static (avec des membres static aussi).

    La classe est sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public static class A
    {
    public static UInt32            m_uMember00;
    public static List< UInt32 >  m_oMember01;
    public static ClassB            m_oMember02;
    public static List< Class C > m_oMember03;
    }
    Habituellement je sérialise comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    FileStream		oFile		= File.Open( sFilename, FileMode.OpenOrCreate );
    XmlSerializer	oSerializer	= new XmlSerializer( typeof( ClassObject ) );
     
    oSerializer.Serialize( oFile, oObject );
    oFile.Close();
    Et pour la désérialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    FileStream		oFile		= File.Open( sFilename, FileMode.Open );
    XmlSerializer	oSerializer	= new XmlSerializer( typeof( List<Sprite> ) );
    oObject	= ( ClassObject )oSerializer.Deserialize( oFile );
    oFile.Close();
    Par contre mes méthodes standard ne fonctionne pas avec des classes statiques. Quelle est la procédure à suivre ?

    Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ca n'a pas de sens de vouloir faire ça... La sérialisation, c'est pour persister des objets (donc des instances), et une classe statique, par définition, n'a pas d'instance.

    De toutes façons, une classe statique avec des données, c'est généralement une mauvaise idée... as-tu vraiment besoin que cette classe soit statique ?

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Par défaut
    au pire fais un singleton

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par giova_fr Voir le message
    au pire fais un singleton
    J'y avais pensé aussi, mais en fait non... un singleton n'a pas de constructeur public, donc la sérialisation XML ne fonctionnera pas.

  5. #5
    Membre éclairé Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Par défaut
    Je suis plus habitué au concept du C++, où le mot clef static est là pour assuré "l'unicité de l'instance", une et une seule instance. Mais il semblerait qu'en C# ce mot est plusieurs sens.

    Je me suis tourné vers solution pour résoudre le problème suivant.
    j'ai plusieurs type, A, B, C, D... Tous ces types sont instanciés dans ma classe static "GameData".
    GameData contient juste des listes de A, B, C, D...
    Le problème c'est que :
    B contient une référence vers A
    C contient une référence vers A
    D contient une référence vers B et C
    ...
    Et lorsque je faisait la sérialisation des éléments static de GameData (AList.xml, BList.xml, CList.xml, DList.xml...)
    Et bien le vrai problème est que:
    DList.xml contient des instances de B et C
    CList.xml contient des instances de A
    BList.xml contient des instances de A

    Ce qui multiplie mes données.

    Comment pourrais-je résoudre ce problème autrement ?

    Merci

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Par défaut
    revois tout

    tu pourrais pour ton probleme de donnée redondante, ajouter un champ Guid à tes objets, et au lieu de sérialiser une liste de reference vers des objets, tu sérialise une liste de Guid. De cette facon par exemple, DList.xml ne contiendrait que le Guid de A et le Guid de B.

    Sinon static est une notion de programmation objet, c'est donc la meme chose que ce soit pour le C++ ou du c#, c'est stocker une fois dans la classe au lieu d'etre stocké à chaque fois dans les instances d'objets. Son but est donc précis : partager une donnée commune à toutes les instance de la classe.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par SKone Voir le message
    Je suis plus habitué au concept du C++, où le mot clef static est là pour assuré "l'unicité de l'instance", une et une seule instance. Mais il semblerait qu'en C# ce mot est plusieurs sens.
    Je ne connais pas très bien C++, mais il me semble au contraire que c'est en C++ que le mot-clé static a plusieurs sens complètement différents (voir ici, ou encore ). En tous cas je suis à peu près sûr que ça ne sert pas à "assurer l'unicité de l'instance"...

    En C#, on peut à la rigueur considérer qu'il 2 sens, mais ils sont liés.
    - sur un membre d'une classe, il signifie que le membre n'appartient pas à une instance particulière de la classe, mais à la classe en général
    - sur une classe, il signifie que la classe n'a que des membres statiques (et au passage, qu'elle ne peut pas être instanciée, ce qui de toutes façons n'aurait pas beaucoup de sens).

  8. #8
    Membre éclairé Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Par défaut
    En C++ c'est la même chose :
    "sur un membre d'une classe, il signifie que le membre n'appartient pas à une instance particulière de la classe, mais à la classe en général"
    Donc ça assure l'unicité d'une instance d'un "objet" ou d'une "variable" mais pas d'une classe...

    En ce qui concerne mon problème pour la sérialisation de référence... Personne n'a d'idée ?

  9. #9
    Membre émérite

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Par défaut
    Donc ça assure l'unicité d'une instance d'un "objet" ou d'une "variable" mais pas d'une classe...
    C'est pas une question d'unicité, c'est juste que static lie à la classe au lieu de lier aux objets.


    Tous ces types sont instanciés dans ma classe static "GameData".
    GameData contient juste des listes de A, B, C, D...
    A mon avis c'est plus un problème de conception, pourquoi est ce que cette classe est statique ? Y'a t il vraiment un intérêt ?
    Mon blog sur les technos .NET et Agile -> http://blog.developpez.com/maximepalmisano/

  10. #10
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Par défaut
    Citation Envoyé par SKone Voir le message
    En C++ c'est la même chose :
    En ce qui concerne mon problème pour la sérialisation de référence... Personne n'a d'idée ?
    Je te l'ai donné la solution non?

    les Guid

    Et comme le disent les autres oublie le static, on ne peut pas le sérialiser.

  11. #11
    Membre éclairé Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Par défaut
    Ah oups ! Je n'avais pas vu...

    Oui en effet c'est une solution Je prend

    Merci

    [Résolu]

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

Discussions similaires

  1. Compiler une classe static à la volée
    Par cylere dans le forum Général Java
    Réponses: 0
    Dernier message: 02/02/2012, 18h14
  2. sérialiser un objet d'une classe du framework
    Par anat1212 dans le forum VB.NET
    Réponses: 1
    Dernier message: 31/10/2010, 00h01
  3. Déclarer une classe Static
    Par remibeginer dans le forum ASP.NET
    Réponses: 2
    Dernier message: 22/05/2008, 16h00
  4. Réponses: 4
    Dernier message: 27/07/2007, 20h34
  5. [Info] variable d'une classe static
    Par romdelf dans le forum Langage
    Réponses: 21
    Dernier message: 06/12/2005, 15h08

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