2010-12-07 1 views
1

Это не дубликат этого question. Я должен сериализовать Свойство, которое является «ReadOnly». Я не могу ничего сделать в этом классе, потому что это класс System.Web.Security.MembershipUser, конечно, это не запечатанный класс.Сериализация данных только для чтения

[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; 
} 

Над кодом, что я использовал,

MembershipUserCollection userCollection = Membership.GetAllUsers(); 

GetAllUsers метод возвращает MembershipUserCollection, но это не имеет по умолчанию аксессор. Поэтому при сериализации я получаю исключение. Именно по этой причине я пошел с List<MembershipUser>. Здесь тоже я сталкиваюсь с проблемой. Это есть мой день, что может решить это ?.

Редактировать: Я использую XmlSerializer.

ответ

2

Сериализация будет сериализовать только публичные поля, а также общедоступные объекты, которые вы можете получить и установить. Причина последнего заключается в том, что если вы не можете установить его, то когда вы идете на десериализацию, как вы устанавливаете свойство?

Поскольку класс не запечатан, вы могли бы наследовать от него, определить сеттер, но у него ничего не делать, то есть

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

вещи, чтобы высматривать, когда вы десериализацию к этому классу, данные будут потеряны.

НТН, Brian

+0

Зависит от сериализатора - WCF DataContractSerializer с удовольствием сериализует частные члены, если вы на них накладываете атрибут [DataMember] ..... – 2010-12-07 17:03:23

0

Я бы предложил создать обертку над MembershipUserCollection для вашего сериализации/десериализации цели.

Кроме того, вы уверены, что выше код бросает исключение, потому что поля имеют частные члены? Это может быть из-за отсутствия атрибута Serializable или конструктора по умолчанию !!!