2012-02-09 2 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; } 
    } 
} 

А вот метод я использую для десериализации (опять же, код пропущены для краткости)

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 
Смежные вопросы