I have following data 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 of Presence to XML and deserializing the same XML back to an instance of Presence works well. But deserializing a string variable which represents a serialized Presence object gave me strange behaviors. Some properties got default values rather than the specified values from the XML. I have found out that the elements in the XML which represent the properties of Presence must be alphabetically ordered.
For example in this snippet of code
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;
the three instances are all 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 the elements in the XML have to be sorted? Does anybody know why the DataContractSerializer otherwise does not deserialize correctly?