2013-08-27 5 views
2

나는 데이터 계약을 다음 있습니다 :왜 DataContractSerializer는 알파벳순으로 정렬 된 XML이 필요합니까?

namespace Wcf.Contracts.Data 
{ 
    [DataContract] 
    public class Presence 
    { 
    [DataMember] 
    public int Id { get; set; } 

    [DataMember] 
    public DateTime? From { get; set; } 

    [DataMember] 
    public DateTime? To { get; set; } 

    [DataMember] 
    public TimeSpan? BreakPeriod { get; set; } 
    } 
} 

XML에 Presence의 인스턴스를 직렬화 잘 Presence 작품의 인스턴스로 다시 같은 XML을 역 직렬화. 그러나 직렬화 된 Presence 객체를 나타내는 문자열 변수를 비 직렬화하면 이상한 행동을하게됩니다. 일부 속성은 XML에서 지정된 값보다는 기본값을가집니다. 나는 Presence의 속성을 나타내는 XML 요소가 사전 순으로 정렬되어야한다는 것을 알게되었습니다.

var dcs = new System.Runtime.Serialization.DataContractSerializer(typeof(Wcf.Contracts.Data.Presence)); 

var xml1 = @"<?xml version=""1.0"" encoding=""utf-16""?> 
<Presence xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/Wcf.Contracts.Data""> 
    <BreakPeriod>PT30M</BreakPeriod> 
    <From>2013-08-21T10:00:00Z</From> 
    <To>2013-08-21T15:00:00Z</To> 
    <Id>85</Id> 
</Presence>"; 
var xr1 = System.Xml.XmlReader.Create(new System.IO.StringReader(xml1)); 
var p1 = dcs.ReadObject(xr1) as Wcf.Contracts.Data.Presence; 

var xml2 = @"<?xml version=""1.0"" encoding=""utf-16""?> 
<Presence xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/Wcf.Contracts.Data""> 
    <Id>85</Id> 
    <From>2013-08-21T10:00:00Z</From> 
    <To>2013-08-21T15:00:00Z</To> 
    <BreakPeriod>PT30M</BreakPeriod> 
</Presence>"; 
var xr2 = System.Xml.XmlReader.Create(new System.IO.StringReader(xml2)); 
var p2 = dcs.ReadObject(xr2) as Wcf.Contracts.Data.Presence; 

var xml3 = @"<?xml version=""1.0"" encoding=""utf-16""?> 
<Presence xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/Wcf.Contracts.Data""> 
    <BreakPeriod>PT30M</BreakPeriod> 
    <From>2013-08-21T10:00:00Z</From> 
    <Id>85</Id> 
    <To>2013-08-21T15:00:00Z</To> 
</Presence>"; 

var xr3 = System.Xml.XmlReader.Create(new System.IO.StringReader(xml3)); 
var p3 = dcs.ReadObject(xr3) as Wcf.Contracts.Data.Presence; 

세 개의 인스턴스 코드

의이 조각에서 예를 들어

는 모두 다르다.

  | p1     | p2       | p3 
Id   | default(int) (=0)  | 85       | 85 
From  | 8/21/2013 10:00:00 AM | default(DateTime?) (=null) | 8/21/2013 10:00:00 AM 
To   | 8/21/2013 3:00:00 PM | 8/21/2013 3:00:00 PM  | 8/21/2013 3:00:00 PM 
BreakPeriod | 00:30:00    | default(TimeSpan?) (=null) | 00:30:00 

왜 XML의 요소를 정렬해야합니까? 아무도 왜 DataContractSerializer 그렇지 않으면 올바르게 deserialize하지 않는지 알고 있습니까?

+0

+1 예를 게시하십시오. – Sphinxxx

+1

[DataContractSerializer를 사용하여 XML 비 직렬화] 가능한 복제본 (http://stackoverflow.com/questions/15413468/deserializing-xml-with-datacontractserializer) – chwarr

답변

2

정상입니다. datacontract는 SOAP 메시지에 대한 xml 스키마를 설명합니다. DataContractSerializer는 임의의 알파벳 순서를 사용합니다. 다음을 지정하여 주문을 변경할 수 있습니다.

[DataMember(Order = 1)] 
    public int MyProperty { get; set; } 

주문을 지정해야하는 이유가 무엇입니까? SOAP RFC를 읽을 시간이 없지만 표준화라고 생각합니다.

우리가 그것에 대해 생각하면 속도와 크기를 최적화하기위한 논리입니다. DataContract는 null 속성 값에 대해 xml을 쓰지 않음으로써 null을 지정합니다. 200 개의 속성을 가진 객체가 있다면 속성이 null인지 확인하기 위해 모든 XML을 읽어야합니다. 요소를 정렬 한 xml 스키마가 있으면 더 빠릅니다.

내가 말하는 것이 더 나은 이해에 기여했으면 좋겠다.