2010-02-12 4 views
10

나는 다음과 같은 코드가 있습니다 경우 1에서DataContractSerializer에서 XML을 읽어야합니까?

[DataContract(Namespace = "")] 
public class User 
{ 
    [DataMember] 
    public string UserName { get; set; } 

    [DataMember] 
    public string FullName { get; set; } 
} 

//Deserialization test 
public void Test() 
{ 

    //CASE 1. 
    //string xml = "<User><UserName>john</UserName>" + 
    //     "<FullName>John Lennon</FullName></User>"; 

    //CASE 2. 
    string xml = "<User><FullName>John Lennon</FullName>" + 
         "<UserName>john</UserName></User>"; 


    byte[] byteArray = Encoding.UTF8.GetBytes(xml); 
    User user = null; 
    using (MemoryStream stream = new MemoryStream(byteArray)) 
    { 
    DataContractSerializer serializer = 
      new DataContractSerializer(typeof(User), "User", ""); 
    user = (User)serializer.ReadObject(stream); 
    } 
} 

가하면 FullName 속성은 직렬화되지 않습니다,하지만 경우 2에서 제대로 직렬화 복원됩니다. 왜?

답변

9

주문이 중요합니다. 알파벳 순서는 DataMember 특성에서 순서를 지정하지 않으면 사용됩니다.

이것은 this MSDN article에서 설명됩니다. 일반적으로

, 그것은 항상 명시 적으로 DataMember를에 순서를 지정하는 것이 좋습니다의 속성 :

[DataMember(IsRequired=true, Order=0)] 
public string FullName { get; set; } 

[DataMember(IsRequired=true, Order=1)] 
public string UserName { get; set; } 
관련 문제