I have the following 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; }
}
}
Serializing an instance Presencein XML and deserializing the same XML back to the instance Presenceworks well. But deserializing the string variable representing the serialized object Presencegave me strange behavior. Some properties received default values rather than specified values from XML. I found that the elements in XML that represent the properties Presenceshould be sorted alphabetically.
For example, in this code snippet
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;
all three copies are different.
| 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
Why do XML elements need to be sorted? Does anyone know why DataContractSerializerotherwise it will not deserialize correctly?