2010-12-07 6 views
1

Ceci n'est pas un doublon de ce question. Je dois sérialiser la propriété qui est "ReadOnly". Je ne peux rien faire sur cette classe, parce que c'est la classe System.Web.Security.MembershipUser, bien sûr ce n'est pas une classe scellée.Sérialisation de données de membre en lecture seule

[WebGet] 
public string GetAllUsers() 
{ 
    List<MembershipUser> membershipList = new List<MembershipUser>(); 

    MembershipUserCollection userCollection = Membership.GetAllUsers(); 

    foreach (MembershipUser user in userCollection) 
     membershipList.Add(user); 

    string memberCollection = SerializeToString(membershipList, typeof(List<MembershipUser>)); 

    List<MembershipUser> users = Deserialize(memberCollection, typeof(List<MembershipUser>)) as List<MembershipUser>; 

    return memberCollection; 
} 

code ci-dessus est ce que je,

MembershipUserCollection userCollection = Membership.GetAllUsers(); 

GetAllUsers méthode retourne MembershipUserCollection, mais cela n'a pas accesseur par défaut. Donc, tout en sérialisant, je reçois une exception. C'est la raison pour laquelle je suis allé avec List<MembershipUser>. Ici aussi, je suis confronté à des problèmes. C'est manger ma journée, qu'est-ce qui pourrait résoudre ça?

Éditer: J'utilise XmlSerializer.

Répondre

2

La sérialisation ne sérialisera que les champs publics ainsi que les propriétés publiques que vous pouvez obtenir et définir. La raison de ce dernier est que si vous ne pouvez pas le définir, alors quand vous allez le désérialiser, comment définissez-vous la propriété?

Étant donné que la classe n'est pas scellé, vous pourriez hériter de lui, définir un setter, mais il ne fait rien avoir, à savoir

public string Name 
{ 
    get {return _name;} 
    set { } 
} 

La chose à surveiller est lorsque vous désérialiser à cette classe, les données seront perdues.

HTH, Brian

+0

Dépend du sérialiseur - le DataContractSerializer de WCF va heureusement sérialiser les membres privés, à condition de leur attribuer un attribut [DataMember] ..... –

+0

True; Je pensais au Xml Serializer. La question n'a pas précisé lequel est utilisé, pourrait être une information utile. –

+0

Vous pouvez définir le sérialiseur, je ne savais pas à ce sujet, il peut être DataContractSerializer ou non, Si cela peut, peut-être C'est une solution, mais vous pouvez également écrire votre propre sérialiseur, qui peut accéder aux champs privés, mais en premier devrait vérifier ceux sont des champs privés ou seront créés avec d'autres données. –

0

Je suggère de créer une enveloppe sur MembershipUserCollection pour votre but sérialisation/désérialisation.

Etes-vous sûr que le code ci-dessus lève une exception car les champs ont des membres privés? C'est peut-être à cause de l'attribut Serializable manquant ou du constructeur par défaut !!!

Questions connexes