2012-01-13 52 views
2

我從RESTful服務這在C#DataContractSerializer的問題

<CollectionOfItems> 
    <Item> 
    <Param1>param1 value</Param1> 
    <Param2>param2 value</Param2> 
    </Item> 
    <Item> 
    <Param1>param1 value</Param1> 
    <Param2>param2 value</Param2> 
    </Item> 
</CollectionOfItems> 

這種形式返回XML提取數據是我使用消費REST服務

public object getMetaData(string uri, Type type) 
    { 
     //Create Object To Be Returned 
     object result = null; 
     //Create Web Request 
     HttpWebRequest request = WebRequest.Create(uri) as HttpWebRequest; 
     //Get Response 
     using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
     { 
      if (request.HaveResponse && response != null) 
      { 
       using (Stream reader = response.GetResponseStream()) 
       { 
        DataContractSerializer xmlSer = new DataContractSerializer(type); 

        result = xmlSer.ReadObject(reader); 
       } 
      } 
     } 
     return result; 
    } 

我的方法有一類以匹配<CollectionOfItems>

[CollectionDataContract(Name = "CollectionOfItems", Namespace = "http://matchingnamespace")] 
    public class CollectionOfItems: List<Item> 
    { 
    } 

而一個類來保存<Item>

[DataContract(Name="Item")] 
    public class Item 
    { 
     [DataMember(Name="Param1")] 
     public string param1{ get; set; } 

     [DataMember(Name="Param2")] 
     public string param2{ get; set; } 
    } 

我的問題是,當我的結果結合到列表框我最終與具有結果的正確數目的對象但我只看到的結果作爲空白行。我似乎有一個<CollectionOfItems>與正確的金額<Item>,但我沒有看到param1或param2等的任何值...

+0

您能告訴我們如何將結果綁定到ListBox嗎?當您將由'getmetadata'返回的對象轉換回CollectionOfItems時,您是否在調試器中看到正確的值? – RBDev 2012-01-13 19:18:12

+0

不幸的是,它們在調試器中都是空的。它顯示x結果並找到了正確的課程。它還顯示param1,param2等...但作爲NULLS – Oli 2012-01-13 19:47:49

+0

爲了澄清我打破了後結果= xmlSer.ReadObject(讀者);並看看結果如何 – Oli 2012-01-13 19:55:06

回答

0

一位朋友剛剛爲我解決了這一個。對於有類似問題的人來說,這是答案。如果名稱空間存在於collectiondatacontract中,則還必須在Item datacontract中聲明名稱空間。 I.E

[DataContract(Name="Item", Namespace = "http://matchingnamespace")] 
    public class Item 
    { 
     [DataMember(Name="Param1")] 
     public string param1{ get; set; } 

     [DataMember(Name="Param2")] 
     public string param2{ get; set; } 
    }