gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:58:48 26 4
gpt4 key购买 nike

我有以下数据契约(Contract):

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; }
}
}

Presence 的实例序列化为 XML 并将相同的 XML 反序列化回 Presence 的实例效果很好。但是反序列化表示序列化 Presence 对象的字符串变量给了我奇怪的行为。某些属性获得默认值而不是 XML 中的指定值。我发现 XML 中表示 Presence 属性的元素必须按字母顺序排列。

例如在这段代码中

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 没有正确反序列化?

最佳答案

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

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

为什么要指定顺序?我没有时间阅读 SOAP RFC,但我认为这是正常的。

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

我希望我不得不说的内容有助于更好地理解。

关于c# - 为什么需要 DataContractSerializer 按字母顺序排序的 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18463575/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com