2013-08-14 2 views
1

ServiceStack.Text.XmlSerializer의 문제점은 무엇입니까? 그렇게 타사 XML을 역 직렬화하는xmlnode의 순서를 변경하면 ServiceStack.Text.XmlSerializer.DeserializeFromString 결과가 변경됩니다. 왜?

public class weatherdata : IReturn<WashService> 
{ 
    public Location location { get; set; } 
} 
public class Location 
{ 
    public string name { get; set; } 
    public string country { get; set; } 
} 

시도 :

나는 개체가

var data = ServiceStack.Text.XmlSerializer.DeserializeFromString<weatherdata>("<weatherdata><location><name>Moscow</name><country>RU</country></location></weatherdata>"); 

data.location.name = 모스크바. data.location.country가 NULL입니다. 그런

변경 XML :

var data = ServiceStack.Text.XmlSerializer.DeserializeFromString<weatherdata>("<weatherdata><location><country>RU</country><name>Moscow</name></location></weatherdata>"); 

하고

data.location.name == "Moscow". 
data.location.country =="RU"; 

가 왜 이렇게 다른 결과 난 단지 순서를 변경

있는지?

답변

2

explained here으로 ServiceStack (.NET의 DataContract serializer)에서 사용하는 기본 XML 직렬 변환기는 XML 요소가 클래스에 선언 된 순서와 같아야한다고 가정합니다. XML 스키마 용어에서 요소는 xs:all이 아닌 xs:sequence으로 선언됩니다. 요청에서 가능한 모든 순서로 XML 요소를 지원해야하는 경우 위 링크에서 설명한대로 ServiceStack에서 사용하는 XML 직렬 변환기를 재정의해야 할 수 있습니다.

XML 요소의 순서를 조정하기 만하면 속성을 DataMember 속성으로 꾸미고 Order 속성을 지정하여 요소의 정확한 순서를 지정할 수 있다고 생각합니다. 이 경우, 속성을 사용하여 Location 클래스를 꾸밀 필요가 있습니다.

+0

실제로, DataContractSerializer는 알파벳 순서를 사용합니다. 클래스에서 지정하는 순서는 부적합합니다. –