2012-02-09 51 views
0

我正在使用XmlSerializer將某些XML反序列化爲對象。我遇到的問題是我已經成功地反序列化了,我的一個屬性是數組,其屬性isFixedSize設置爲true。XmlSerializer將數組屬性isFixedSize設置爲true

我需要在稍後階段手動添加到此陣列,但不能。

這裏是我的對象(略去了其他屬性)

namespace Omeda.Customer 
{ 
    [Serializable()] 
    [XmlRoot("Customer")] 
    public class Customer : Error 
    { 
     [XmlArray("CustomerDemographics")] 
     [XmlArrayItem("CustomerDemographic", typeof(CustomerDemographic))] 
     public Omeda.Customer.CustomerDemographic[] CustomerDemographics { get; set; } 
    } 
} 

而且這裏是我使用的反序列化方法(再次,代碼ommitted爲簡潔起見)

private T request_Get<T>(string url) where T : new() 
{ 
    object returnObject = new T(); 

    try 
    { 
     var request = WebRequest.Create(url); 
     request.Method = "GET"; 
     request.ContentType = "text/xml"; 
     request.Headers.Add("x-omeda-appid", this.API_KEY); 
     request.Timeout = 50000; 

     using (var response = request.GetResponse()) 
     { 
      using (var responseStream = response.GetResponseStream()) 
      { 
       XmlSerializer serializer = new XmlSerializer(typeof(T)); 
       returnObject = (T)serializer.Deserialize(responseStream); 
      } 
     } 
    } 
    catch (WebException ex) 
    { 
     ... 
    } 

    return (T)returnObject; 
} 

一旦這個對象返回,customer.CustomerDemographics.IsFixedSize返回true。

任何關於如何解決這個問題的幫助,以及爲什麼會發生這種情況會很好。

+0

您是否試圖序列化這些CustomerDemographic節點到集合呢? – 2012-02-09 11:27:17

+0

你是什麼意思?使用泛型而不是數組? – seanxe 2012-02-09 11:35:25

回答

1

IsFixedSizealways true for an array。如果你「需要在以後的階段手動添加到這個數組」,你不應該使用數組;您應該使用List<CustomerDemographic>或可以種植的另一種集合類型。

+0

現在有意義,當你初始化它時,你總是需要給一個數組一個長度。感謝您指出了這一點! – seanxe 2012-02-09 11:55:52

0

您是否嘗試將這些CustomerDemographic節點序列化爲集合?

爲此,請將typeof(CustomerDemographic)更改爲typeof(List<CustomerDemographic>)。 然後您就可以更改該集合中的項目。或者:

var customer = ... //Customer instance 
var list = new List<CustomerDemographic>(custeomr.CustomerDemographics); 

// change list here: add, remove, replace 

customer.CustomerDemographics = list.ToArray(); 

// continue using customer instance 
相關問題