2010-12-07 4 views
1

이것은 question과 중복되지 않습니다. 나는 "ReadOnly"인 Property를 직렬화해야한다. 이것은 System.Web.Security.MembershipUser 클래스이기 때문에 나는이 클래스에서 아무 것도 할 수 없습니다. 물론 클래스는 봉인되지 않습니다. 코드 위읽기 전용 멤버 데이터 serialize

[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

직렬화는 공용 필드와 가져올 수있는 공용 속성 만 serialize합니다. 후자에 대한 이유는 당신이 그것을 설정할 수 없다면, 당신이 deserialize 갈 때, 당신은 어떻게 속성을 설정합니까? 클래스가 봉인되지 않기 때문에

, 당신은 그 클래스에 역 직렬화 할 때입니다 피려 즉,

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

건을 세터를 정의, 그것으로부터 상속하지만 아무것도하지 않고있을 수있다, 데이터가 손실됩니다.

HTH, 브라이언

+0

serializer에 따라 달라 지므로 WCF DataContractSerializer는 [DataMember] 특성을 넣어주는 한 비공개 멤버를 행복하게 serialize합니다. ..... –

+0

True; 나는 Xml Serializer에 대해 생각하고 있었다. 그 질문은 어떤 것이 사용되고 있는지를 지정하지 않았고, 유용한 정보가 될 수있었습니다. –

+0

당신은 serializer를 설정할 수 있습니다, 나는 이것에 대해 몰랐습니다. DataContractSerializer가 될 수도 있고 없을 수도 있습니다. 가능할 수도 있습니다. 해결책 일 수도 있지만 개인 필드에 액세스 할 수있는 자신의 serializer를 작성할 수도 있지만, 처음에는 그것들은 비공개 필드인지 확인하거나 다른 데이터로 생성 될 것입니다. –

0

나는 당신의 직렬화/역 직렬화하기위한 목적 된 MembershipUserCollection에 대한 래퍼를 만드는 건의 할 것입니다.

또한 필드에 비공개 멤버가 있으므로 위 코드가 예외를 throw하고 있습니까? Serializable 속성 또는 기본 생성자가 없기 때문일 수 있습니다.