.net core DataContractSerializer无法反序列化Net Core 2中的所有属性

.net core DataContractSerializer无法反序列化Net Core 2中的所有属性,.net-core,asp.net-core-2.0,asp.net-core-webapi,datacontractserializer,coreclr,.net Core,Asp.net Core 2.0,Asp.net Core Webapi,Datacontractserializer,Coreclr,我正在尝试使用.NETCore2中的DataContractSerializer将xml反序列化为已知对象 这是我的xml。(我无法控制xml。这就是我如何获得xml作为对某些api方法的响应的方式)。出于测试目的,我捕获了xml并将其放入xml文件中 <Response> <ClientID>TestClient</ClientID> <FileName>E:\MyData\20180223084535390PM.xml</File

我正在尝试使用.NETCore2中的
DataContractSerializer
将xml反序列化为已知对象

这是我的xml。(我无法控制xml。这就是我如何获得xml作为对某些api方法的响应的方式)。出于测试目的,我捕获了xml并将其放入xml文件中

<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>
反序列化代码

    [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);
        }
    }
然而,当它将xml反序列化为对象时,大多数对象属性都是空的,即使它们在xml文件中有相应的值。请参阅下面的“快速观察”

我不确定我在这里错过了什么

更新1
请注意,当我分别用
XmlRoot
xmlement
替换
DataContract
DataMember
属性,然后使用
XmlSerializer
反序列化xml时,生成的对象将填充所有属性。 因此它可以与
XmlSerializer
一起使用,但不能与
DataContractSerializer
一起使用

我想使用
DataContractSerializer

对于DataContractSerializer,默认使用字母顺序;并期望XML元素按该顺序到达;无序元素通常会被丢弃。
似乎收到了XML,您无法更改XML元素的顺序,您可以使用顺序属性,如下所示

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

你的建议奏效了。然而,我想知道为什么他们(微软)会让反序列化依赖于字母顺序?在完整的.NET框架中也是这样吗?因为我以前在完整的.NET框架中使用过
DataContractSerializer
,所以我不记得在完整的.NET框架中订购过DataMemebr,这是一样的。我认为这与序列化对象的方式有关。一般来说,如果您通过
DataContractSerializer
序列化对象,我认为您不需要指定
Order
属性。正如我提到的,我们将获取XML字符串作为外部API调用的一部分,因此我无法控制它的序列化方式。因此,作为您的更新1和我的解决方案,如果不想指定顺序,可以使用
XmlSerializer
,如果想使用
DataContractSerializer
,则需要指定
Order
[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; }
}