39 votes

C # sérialiser un membre de classe privée

class Person
{
    public string m_name;
    private int m_age; // << how do I serialize the darn little rat?
}

Question Simple et pourtant, il semble comme un gros gâchis quand on essaie d'y répondre.
Tout le monde suggèrent d'utiliser les getter/setter, mais mon appli est trop gros et faire un getter/setter pour chaque membre de la juste cause de la maintenabilité des questions.

Suis-je obligé de créer une sérialisation personnalisée ici ou est-il un attribut de la magie pour les membres?
Comment sérialiser privé des membres de la classe?

Edit #1:
Ok tout le monde, désolé pour le unclarity, j'étais un peu en colère quand j'ai écrit cette question, il a été plusieurs heures après avoir essayé de trouver la solution.
De toute façon, voici quelques faits:
1. Je suis en train de XML sérialiser cette classe. Actuellement, je suis en utilisant System.Xml.Serialization.XmlSerializer.
2. Je suis de la sérialisation en XML de la version de compatibilité, qui, autant que je comprends binaire ne pas m'offrir ça.
3.J'espérais qu'il y a un certain attribut comme:

class Person
{
    public string m_name;
    [SerializeThat(ElementName="Age")]
    private int m_age; // << how do I serialize the darn little rat?
}

OU (continuer de fait #3) un attribut qui va sur la classe qui ressemblerait à:

[Serializable(DoPrivate = true, DoProtected = true)]
class Person
{
    public string m_name;
    private int m_age; // << how do I serialize the darn little rat?
}

Maintenant, que puis-je faire pour le réaliser?

19voto

Brad Christie Points 58505

Partant de l'hypothèse d'une faute de frappe, je voudrais vous rediriger vers cet article SO où la solution consiste à utiliser un DataContractSerializer place.

9voto

Oliver Points 19006

Je ne sais pas si vous pouvez utiliser DataContract . Mais avec cela, vous pourriez écrire:

 [DataContract]
class Person
{
    [DataMember]
    public string m_name;

    [DataMember]
    private int m_age;
}
 

L'avantage de DataContract est que vous pouvez sérialiser des champs privés et que votre classe n'a pas besoin d'un constructeur par défaut.

8voto

Daniel Mošmondor Points 10926

Si vous utilisez BinaryFormatter, ça va aller pour ta classe privée des parties.

Marque de chaque classe de la vôtre avec [Serializable] ou vous n'irez pas loin...

Aussi, regardez ceci: Pourquoi est Sérialisable Attribut requis pour un objet à sérialiser

Puisque vous avez besoin de XML, peut-être que vous pouvez tirer vous-même si tout cela avec SoapFormatter. Voir c'.

À propos de la version de compatibilité: - je utiliser BinaryFormatter et n'ont pas de problèmes avec le schéma de mises à niveau. Essayez s'il vous plaît: vous pouvez gérer les changements de schéma de vous-même, à nos tout simplement remplacer les pointeurs null laissés de côté par l' Deserialize avec par défaut appropriée des constructions. Si vous n'avez pas vraiment besoin les fonctionnalités XML de fournir, aller binaire - vous ne serez jamais regarder en arrière.

Aussi, un de plus EDIT:

BF sera facilement résoudre tous vos multiples références afin de ne pas créer plusieurs instances de la même référence, à plusieurs reprises. Suppose que vous n'aurez pas le cas avec XmlSerializer - il est évident qu'il n'a pas de place pour stocker cette information.

Exemple:

class Data
{
    int a;
}

class ManyData
{
    Data d1;
    Data d2;
}

...

ManyData md=new ManyData();
md.d1=new Data();
md.d2=md.d1;

Essayez de sérialisation/désérialisation md avec plusieurs alternatives...

5voto

Marc Gravell Points 482669

Quel sérialiseur avez-vous mangé actuellement? Presque tous devraient travailler avec cela. Mais les champs publics * sont * une mauvaise idée. XmlSerializer et JavaScriptSerializer ignoreront les membres privés. DataContractSerializer et protobuf-net peuvent traiter avec des membres privés. BinaryFormatter gère les champs (publics ou privés), mais n'est pas une bonne idée OMI pour de nombreuses raisons.

2voto

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X