Reputation: 34089
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.
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
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