C# 为什么需要DataContractSerializer按字母顺序排序的XML?

C# 为什么需要DataContractSerializer按字母顺序排序的XML?,c#,xml,serialization,datacontractserializer,alphabetical,C#,Xml,Serialization,Datacontractserializer,Alphabetical,我有以下数据合同: 名称空间Wcf.Contracts.Data { [数据合同] 公共课堂出席 { [数据成员] 公共int Id{get;set;} [数据成员] 公共日期时间?从{get;set;} [数据成员] 公共日期时间?到{get;set;} [数据成员] 公共时间跨度?中断周期{get;set;} } } 将Presence的实例序列化为XML,并将相同的XML反序列化回Presence的实例,效果很好。但是反序列化表示序列化的存在对象的字符串变量给了我奇怪的行为。某些属性从X

我有以下数据合同:

名称空间Wcf.Contracts.Data
{
[数据合同]
公共课堂出席
{
[数据成员]
公共int Id{get;set;}
[数据成员]
公共日期时间?从{get;set;}
[数据成员]
公共日期时间?到{get;set;}
[数据成员]
公共时间跨度?中断周期{get;set;}
}
}
Presence
的实例序列化为XML,并将相同的XML反序列化回
Presence
的实例,效果很好。但是反序列化表示序列化的
存在
对象的字符串变量给了我奇怪的行为。某些属性从XML中获取默认值而不是指定值。我发现XML中表示
Presence
属性的元素必须按字母顺序排列

例如,在这段代码中

var dcs=new System.Runtime.Serialization.DataContractSerializer(typeof(Wcf.Contracts.Data.Presence));
变量xml1=@”
PT30M
2013-08-21T10:00:00Z
2013-08-21T15:00:00Z
85
";
var xr1=System.Xml.XmlReader.Create(new-System.IO.StringReader(xml1));
var p1=dcs.ReadObject(xr1)作为Wcf.Contracts.Data.Presence;
变量xml2=@”
85
2013-08-21T10:00:00Z
2013-08-21T15:00:00Z
PT30M
";
var xr2=System.Xml.XmlReader.Create(new System.IO.StringReader(xml2));
var p2=dcs.ReadObject(xr2)作为Wcf.Contracts.Data.Presence;
变量xml3=@”
PT30M
2013-08-21T10:00:00Z
85
2013-08-21T15:00:00Z
";
var xr3=System.Xml.XmlReader.Create(new System.IO.StringReader(xml3));
var p3=dcs.ReadObject(xr3)作为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不能正确反序列化吗?

这很正常。datacontract将描述soap消息的xml模式。DataContractSerializer使用任意字母顺序。您可以通过指定来更改顺序:

    [DataMember(Order = 1)]
    public int MyProperty { get; set; }
为什么需要指定订单?我没有时间阅读SOAPRFC,但我认为这是正常化

如果我们仔细想想,这是速度和尺寸优化的逻辑。DataContract通过不为null属性值写入任何xml来指定null。想象一下,如果您有一个具有200个属性的对象,那么您必须读取所有xml以确定该属性是否为null。如果您有一个有序元素的xml模式,它会更快


我希望我所说的有助于更好地理解。

+1发布一个工作示例。可能重复