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

Framework .NET Discussion :

Sérialisation XML et membre privé


Sujet :

Framework .NET

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut Sérialisation XML et membre privé
    Bonjour
    J'ai une classe que je souhaite sérialisé.
    Or j'ai des propriétés privés que je souhaite sérialiser. Or pour le sérialiser je dois le rendre public. Mais je n'ai pas envie que d'autres classes y ai accès (d'où le privé).

    Comment faire ? Suis-je obligé de le rendre public ?

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    public int Score { get; private set; }

    Merci

  2. #2
    Membre Expert Avatar de meziantou
    Homme Profil pro
    autre
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Par défaut
    Tu peux implémenter l'interface IXmlSerializable
    http://msdn.microsoft.com/fr-fr/libr...ializable.aspx

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut
    Ca ne résoud pas mon problème d'accès à ma propriété qui est privé.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 69
    Par défaut
    Avec l'interface IXmlSerializable c'est toi qui va serializé et désérializé l'objet donc tu peu y ajouter tes champs privé.

  5. #5
    Membre Expert Avatar de meziantou
    Homme Profil pro
    autre
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 8
    Par défaut
    La solution proposée par Meziantou fonctionne effectivement.

    Par contre, une autre solution est d'avoir la business class souhaitée avec l'accessibilité souhaitée sur ses properties et d'avoir un objet "XML" avec toutes ses properties public pour la sérialisation/désérialisation
    En résumé: bien séparer les classes par rapport à leur utilisation

  7. #7
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Datacontractserializer permet de sérialiser les champs private.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par GuruuMeditation Voir le message
    Datacontractserializer permet de sérialiser les champs private.
    Je ne pense que ça ne marche pas si les accesseurs et les modifications sont en private.

  9. #9
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    Je ne pense que ça ne marche pas si les accesseurs et les modifications sont en private.
    Ça dépend de la plate forme. WPF, pas de problèmes. Silverlight et WP7 sont moins permissifs (En gros, pas de reflection sur du private) mais il y a moyen de plus ou moins contourner en jouant avec l'accesseur internal.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par GuruuMeditation Voir le message
    Ça dépend de la plate forme. WPF, pas de problèmes. Silverlight et WP7 sont moins permissifs (En gros, pas de reflection sur du private) mais il y a moyen de plus ou moins contourner en jouant avec l'accesseur internal.
    Dans ce thread on parle de la visibilité au niveau des accesseurs et modificateurs mais pas au niveau des champs. Ton premier post parle de la visibilité au niveau des champs. Si tu confirmes que la sérialisation est possible quel que soit la visibilité des accesseurs et modificateurs avec la classe DataContractSerializer dans les différentes technologies .Net à l'exception de Silverlight (RIA et WP7) alors c'est mais cela n'empêche que je préfère vérifier pour être sûr.

  11. #11
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Par défaut
    Bonjour,

    Je confirme que dans le cas présent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [DataMember]
    public int Score { get; private set; }
    l'utilisation de "Datacontract" est viable, ca marche aussi avec des choses du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [DataMember]
    private int _score;
    Par contre j'ai jamais tester sur Silverlight ou WP7

  12. #12
    Invité
    Invité(e)
    Par défaut
    Cool, j'avais aussi testé de mon côté et j'ai oublié de venir confirmer. Merci.

  13. #13
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    Dans ce thread on parle de la visibilité au niveau des accesseurs et modificateurs mais pas au niveau des champs. Ton premier post parle de la visibilité au niveau des champs. Si tu confirmes que la sérialisation est possible quel que soit la visibilité des accesseurs et modificateurs avec la classe DataContractSerializer dans les différentes technologies .Net à l'exception de Silverlight (RIA et WP7) alors c'est mais cela n'empêche que je préfère vérifier pour être sûr.
    C'est parce que parfois je m'y perd avec les termes franco-français
    En Belgique (Bruxelles en tout cas) on parle de field, ou de getter/setter. Ceci étant dit, nous avons une belle langue, et je suis parfois attristé de parler tant franglais!

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut
    Ca ne marche pas, j'ai une exception au moment de la sérialisation


    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
    XmlSerializer xs = new XmlSerializer(typeof(Player));
     
    public class Player
        {
     
     
            [DataMember]
            public int Score { get; private set; }
     
     
            public Player()
            {
            }
    }

    Impossible de générer une classe temporaire (result=1).
    error CS0200: La propriété ou l'indexeur 'BuzzerGame.BLL.Player.Score' ne peut pas être assigné -- il est en lecture seule

  15. #15
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Citation Envoyé par julplemet Voir le message
    Par contre, une autre solution est d'avoir la business class souhaitée avec l'accessibilité souhaitée sur ses properties et d'avoir un objet "XML" avec toutes ses properties public pour la sérialisation/désérialisation
    En résumé: bien séparer les classes par rapport à leur utilisation
    C'est une très judicieuse suggestion à mon humble avis et la meilleure des solutions.

  16. #16
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Citation Envoyé par Oberown Voir le message
    Ca ne marche pas, j'ai une exception au moment de la sérialisation
    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
    XmlSerializer xs = new XmlSerializer(typeof(Player));
     
    public class Player
        {
     
     
            [DataMember]
            public int Score { get; private set; }
     
     
            public Player()
            {
            }
    }
    Normal avec xmlserializer. Comme dit plus haut, essaye avec datacontractserializer

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 849
    Par défaut
    C'est bon.
    Mais juste un problème le fichier xml est sur une ligne. Il n'y a pas de retour à la ligne ni d'indentation.

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

Discussions similaires

  1. Des membres privés
    Par Gruik dans le forum C
    Réponses: 6
    Dernier message: 06/12/2006, 22h13
  2. Heritage et membre privé
    Par b Oo dans le forum C++
    Réponses: 5
    Dernier message: 27/11/2006, 22h20
  3. Problème sérialisation XML [C#]
    Par AlphonseBrown dans le forum Windows Forms
    Réponses: 4
    Dernier message: 27/04/2006, 22h58
  4. acces au membres privés
    Par le y@m's dans le forum Langage
    Réponses: 6
    Dernier message: 22/09/2005, 15h52
  5. [VB.NET] Sérialisation XML de Collections
    Par nico-pyright(c) dans le forum Windows Forms
    Réponses: 8
    Dernier message: 15/12/2004, 15h28

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