2012-02-09 16 views
0

XmlSerializerを使用してXMLをオブジェクトに逆シリアル化しています。私が抱えている問題は、いったん私が正常に逆シリアル化したことです、配列である私のプロパティの1つがプロパティー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; } 
    } 
} 

そして、ここで私は(、再び簡潔にするために省略さコード)をデシリアライズするために使用している方法だ

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ノードをコレクションにシリアル化しようとしましたか? –

+0

どういう意味ですか?配列の代わりに汎用を使用していますか? – seanxe

答えて

1

IsFixedSizeは、always true for an arrayである。この配列を後の段階で手動で追加する必要がある場合は、配列を使用しないでください。おそらくList<CustomerDemographic>、または成長可能な別のコレクションタイプを使用しているはずです。

+0

これは意味があります。初期化するときには常に配列に長さを指定する必要があります。それを指摘してくれてありがとう! – seanxe

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 
関連する問題