2014-07-10 40 views
0

在我们的项目中,我们从xml格式的wcf服务获取响应,我们想要使用datacontract序列化器进行反序列化。使用datacontractserializer反序列化wcf xml响应C#

下面是xml响应。

<ArrayOfCustomerData xmlns="http://schemas.datacontract.org/2004/07/PACRM.QCT"> 
<CustomerData> 
<AccountID>String content</AccountID> 
<AccountName1>String content</AccountName1>  
</CustomerData> 
<CustomerData> 
<AccountID>String content</AccountID> 
<AccountName1>String content</AccountName1>  
</CustomerData> 
</ArrayOfCustomerData> 

我们编写了以下DataContract类来反序列化xml。

[DataContract] 
public class ArrayOfCustomerData 
{ 
    [DataMember(Name="CustomerData")] 
    public CustomerData[] customerData { get; set; } 
} 

[DataContract] 
public class CustomerData 
{ 
[DataMember(IsRequired = true, Name = "AccountID")] 
    public string new_AccountID { get; set; } 

    [DataMember(IsRequired = true, Name = "AccountName1")] 
    public string new_accountname1 { get; set; } 
} 

C#反序列化代码如下。

DataContractSerializer dcs = new DataContractSerializer(typeof(ArrayOfCustomerData)); 
     ArrayOfCustomerData data=new ArrayOfCustomerData(); 
     using (var stream = new StreamReader(response.GetResponseStream())) 
     { 
      var text=stream.ReadToEnd(); 
      MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(text)); 
      XmlDictionaryWriter xdw = XmlDictionaryWriter.CreateTextWriter(ms, Encoding.UTF8); 
      dcs.WriteObject(xdw, data); 
     } 

当我检查data.cusotmerData时,它返回null。 任何人都可以为这个问题提供解决方案吗?谢谢!

回答

0

您不需要类ArrayOfCustomerData - 这只是为期望的XML添加一个不必要的额外元素。您可以使用CustomerData[]作为传递给DataContractSerializer构造函数的类型,如下所示:

public class StackOverflow_24673714 
{ 
    const string XML = @"<ArrayOfCustomerData xmlns=""http://schemas.datacontract.org/2004/07/PACRM.QCT""> 
    <CustomerData> 
    <AccountID>String content ID 1</AccountID> 
    <AccountName1>String content name 1</AccountName1>  
    </CustomerData> 
    <CustomerData> 
    <AccountID>String content ID 2</AccountID> 
    <AccountName1>String content name 2</AccountName1>  
    </CustomerData> 
</ArrayOfCustomerData>"; 

    [DataContract(Name = "CustomerData", Namespace = "http://schemas.datacontract.org/2004/07/PACRM.QCT")] 
    public class CustomerData 
    { 
     [DataMember(IsRequired = true, Name = "AccountID")] 
     public string new_AccountID { get; set; } 

     [DataMember(IsRequired = true, Name = "AccountName1")] 
     public string new_accountname1 { get; set; } 
    } 

    public static void Test() 
    { 
     var ms = new MemoryStream(); 
     var ws = new XmlWriterSettings { Indent = true, IndentChars = " ", OmitXmlDeclaration = true, Encoding = Encoding.UTF8 }; 
     var w = XmlWriter.Create(ms, ws); 
     var dcs = new DataContractSerializer(typeof(CustomerData[])); 
     var obj = new CustomerData[] { 
      new CustomerData { new_AccountID = "String content 1", new_accountname1 = "String content 2" }, 
      new CustomerData { new_AccountID = "String content 3", new_accountname1 = "String content 4" } 
     }; 
     dcs.WriteObject(w, obj); 
     w.Flush(); 
     Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray())); 

     ms = new MemoryStream(Encoding.UTF8.GetBytes(XML)); 
     var cds = (CustomerData[])dcs.ReadObject(ms); 
     Console.WriteLine(cds.Length); 
     foreach (var cd in cds) 
     { 
      Console.WriteLine(" {0} - {1}", cd.new_AccountID, cd.new_accountname1); 
     } 
    } 
}