使用DataContractSerializer反序列化XML

我有一个返回以下数据的Web服务:

  12345   25 ELM ST  ELM ST     

我有一个匹配的类结构:

 [DataContract(Name="RESPONSE", Namespace="")] public class Response { [DataMember(Name="KEY")] public string Key { get; set; } [DataMember(Name = "PROPERTY")] public Property Property { get; set; } } [DataContract(Name="PROPERTY", Namespace="")] public class Property { [DataMember(Name="PROPERTY_ADDRESS")] public PropertyAddress Address { get; set; } } [DataContract(Name="PROPERTY_ADDRESS", Namespace="")] public class PropertyAddress { [DataMember(Name="STREET_NUM")] public string StreetNumber { get; set; } [DataMember(Name = "STREET_ADDRESS")] public string StreetAddress { get; set; } [DataMember(Name = "STREET_PREFIX")] public string StreetPrefix { get; set; } [DataMember(Name = "STREET_NAME")] public string StreetName { get; set; } [DataMember(Name = "STREET_TYPE")] public string StreetType { get; set; } [DataMember(Name = "STREET_SUFFIX")] public string StreetSuffix { get; set; } } 

我的反序列化代码如下所示:

 [Test] public void TestMapping() { var serializer = new DataContractSerializer(typeof(Response)); Response response = null; using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(XmlData))) { response = (Response)serializer.ReadObject(ms); } //This works Assert.AreEqual("12345", response.Key); //This works Assert.AreEqual("25", response.Property.Address.StreetNumber); //This FAILS. StreetAddress is null Assert.AreEqual("ELM ST", response.Property.Address.StreetAddress); } 

对于我的生活,我无法弄清楚StreetAddress失败的原因。 它必须是我想念的简单事物。

DataContractSerializer期望事物按字母顺序排列 。 您需要将Order添加到数据成员才能使其正常工作。

 [DataContract(Name = "PROPERTY_ADDRESS", Namespace = "")] public class PropertyAddress { [DataMember(Name = "STREET_NUM", Order=0)] public string StreetNumber { get; set; } [DataMember(Name = "STREET_ADDRESS", Order=1)] public string StreetAddress { get; set; } [DataMember(Name = "STREET_PREFIX", Order=2)] public string StreetPrefix { get; set; } [DataMember(Name = "STREET_NAME", Order=3)] public string StreetName { get; set; } [DataMember(Name = "STREET_TYPE", Order=4)] public string StreetType { get; set; } [DataMember(Name = "STREET_SUFFIX",Order=5)] public string StreetSuffix { get; set; } } 

您必须使用元素的顺序来扩充数据协定,因为DataContractSerializer期望默认情况下按字母顺序对元素进行排序。 您的XML不是这种情况。

这是代码:

 [DataContract(Name = "PROPERTY_ADDRESS", Namespace = "")] public class PropertyAddress { [DataMember(Name = "STREET_NUM", Order=1)] public string StreetNumber { get; set; } [DataMember(Name = "STREET_ADDRESS", Order=2)] public string StreetAddress { get; set; } [DataMember(Name = "STREET_PREFIX", Order=3)] public string StreetPrefix { get; set; } [DataMember(Name = "STREET_NAME", Order=4)] public string StreetName { get; set; } [DataMember(Name = "STREET_TYPE", Order=5)] public string StreetType { get; set; } [DataMember(Name = "STREET_SUFFIX", Order=6)] public string StreetSuffix { get; set; } }