XmlSerializer устанавливает свойство массива isFixedSize в true - PullRequest
0 голосов
/ 09 февраля 2012

Я использую XmlSerializer для десериализации некоторого XML в объект. Проблема, с которой я столкнулся, заключается в том, что после успешной десериализации одно из моих свойств, которое представляет собой массив, имеет свойство 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.

Любая помощь в том, как обойти это, и почему это происходит, было бы здорово.

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

IsFixedSize равно всегда верно для массива .Если вам «нужно добавить в этот массив вручную на более позднем этапе», вам не следует использовать массив;вам, вероятно, следует использовать List<CustomerDemographic> или другой тип коллекции, который можно выращивать.

0 голосов
/ 09 февраля 2012

Попытались ли вы вместо этого сериализовать эти узлы 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
...