LP13
LP13

Reputation: 34089

DataContractSerializer could not de-serialize all properties in Net Core 2

i am trying to de-serialize xml into known object using DataContractSerializer in .NET Core 2.

Here is my xml. ( I do not have control over xml. This is how i get the XML as response to some api method). For testing purpose i have captured the xml and put in xml file.

<Response>
  <ClientID>TestClient</ClientID>
  <FileName>E:\MyData\20180223084535390PM.xml</FileName>
  <UploadStatus>Succeeded</UploadStatus>
  <UploadMessage>Imported Successfully</UploadMessage>
  <ConfirmationNumber>0abcb25f2675</ConfirmationNumber>
  <ImportTime>2018-02-23T15:48:01.887</ImportTime>
  <StartTime>2018-02-23T15:48:03.113</StartTime>
  <EndTime>2018-02-23T15:53:14.76</EndTime>
  <Count>6</Count>
  <Amount>3446.3500</Amount>
  <Messages />
</Response>

My corresponding C# object

[DataContract(Name = "Response", Namespace = "")]
public class MyResponse
{
    [DataMember]
    public string ClientID { get; set; }

    [DataMember]
    public string FileName { get; set; }

    [DataMember]
    public string UploadStatus { get; set; }

    [DataMember]
    public string UploadMessage { get; set; }

    [DataMember]
    public string ConfirmationNumber { get; set; }

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

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

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

    [DataMember]
    public int? Count { get; set; }

    [DataMember]
    public decimal? Amount { get; set; }

    [DataMember]
    public string Messages { get; set; }    
}

De-serialization code

    [Fact]
    public void TestDeSerialize()
    {
        var file = AppDomain.CurrentDomain.BaseDirectory + "Data\\test.xml";
        var serializer = new System.Runtime.Serialization.DataContractSerializer(typeof(MyResponse));
        MyResponse result = null;
        using (var fs = new FileStream(file, FileMode.Open, FileAccess.Read))
        {
            result = (MyResponse)serializer.ReadObject(fs);
        }
    }

However when it de-serializes the xml into object, most of the object properties are NULL even though they have corresponding values in XML file. See quickwatch below.

enter image description here

I am not sure what i am missing here??

Update 1
Note that, When i replace DataContract and DataMember attributes with XmlRoot and XmlElement respectively, and then de-serialize the xml using XmlSerializer then the resultant object has all the properties populated. So it works with XmlSerializer but not with DataContractSerializer.
I would like to use DataContractSerializer

Upvotes: 0

Views: 2218

Answers (1)

Edward
Edward

Reputation: 29976

For DataContractSerializer, it is default to use Alphabetical ordering; and expects XML elements to arrive in that order; Out of order elements are discarded usually.
It seems the XML is received, and you could not change the XML elements order, you could use Order property like below.

[DataContract(Name = "Response", Namespace = "")]
public class MyResponse
{
    [DataMember(Order =1)]
    public string ClientID { get; set; }
    [DataMember(Order = 2)]
    public string FileName { get; set; }
    [DataMember(Order = 3)]
    public string UploadStatus { get; set; }
    [DataMember(Order = 4)]
    public string UploadMessage { get; set; }
    [DataMember(Order = 5)]
    public string ConfirmationNumber { get; set; }
    [DataMember(Order = 6)]
    public DateTime? ImportTime { get; set; }
    [DataMember(Order = 7)]
    public DateTime? StartTime { get; set; }
    [DataMember(Order = 8)]
    public DateTime? EndTime { get; set; }
    [DataMember(Order = 9)]
    public int? Count { get; set; }
    [DataMember(Order = 10)]
    public decimal? Amount { get; set; }
    [DataMember(Order = 11)]
    public string Messages { get; set; }
}

Upvotes: 2

Related Questions