【问题标题】:DataContractSerializer could not de-serialize all properties in Net Core 2DataContractSerializer 无法反序列化 Net Core 2 中的所有属性
【发布时间】:2018-02-28 00:02:04
【问题描述】:

我正在尝试使用 .NET Core 2 中的 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>

我对应的 C# 对象

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

反序列化代码

    [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 为对象时,大多数对象属性为 NULL,即使它们在 XML 文件中具有相应的值。请参阅下面的快速观看。

我不确定我在这里缺少什么??

更新 1
请注意,当我分别用XmlRootXmlElement 替换DataContractDataMember 属性,然后使用XmlSerializer 反序列化xml 时,生成的对象将填充所有属性。 所以它适用于XmlSerializer,但不适用于DataContractSerializer
我想用DataContractSerializer

【问题讨论】:

    标签: .net-core asp.net-core-2.0 asp.net-core-webapi datacontractserializer coreclr


    【解决方案1】:

    对于DataContractSerializer,默认使用字母排序;并期望 XML 元素按该顺序到达;乱序元素通常会被丢弃。
    似乎收到了 XML,您无法更改 XML 元素的顺序,您可以使用 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; }
    }
    

    【讨论】:

    • 你的建议奏效了。但是我想知道为什么他们(微软)会使反序列化依赖于字母顺序?在完整的 .NET 框架中也是如此吗?因为在我不记得订购 DataMemebrs 之前,我在 Full NET 框架中使用过DataContractSerializer
    • 在完整的 .net 框架中也是如此。我认为这与您如何序列化对象有关。一般来说,如果你通过DataContractSerializer序列化对象,我认为你不需要指定Order属性。
    • 正如我提到的,我们正在获取 XML 字符串作为外部 API 调用的一部分,所以我无法控制它是如何被序列化的
    • 如果是这样,作为你的Update1和我的解决方案,如果你不想指定Order,你可以使用XmlSerializer ,如果你想使用DataContractSerializer,你需要指定@987654327 @.
    猜你喜欢
    • 2018-05-09
    • 1970-01-01
    • 2011-04-23
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多