【发布时间】: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
请注意,当我分别用XmlRoot 和XmlElement 替换DataContract 和DataMember 属性,然后使用XmlSerializer 反序列化xml 时,生成的对象将填充所有属性。
所以它适用于XmlSerializer,但不适用于DataContractSerializer。
我想用DataContractSerializer
【问题讨论】:
标签: .net-core asp.net-core-2.0 asp.net-core-webapi datacontractserializer coreclr