XmlSerializer将数组属性isFixedSize设置为true

本文关键字:设置 true isFixedSize 属性 数组 XmlSerializer | 更新日期: 2023-09-27 18:24:05

我正在使用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。

任何关于如何绕过这一问题以及为什么会发生这种情况的帮助都将是非常棒的。

XmlSerializer将数组属性isFixedSize设置为true

IsFixedSize对于数组始终为true。如果"以后需要手动添加到此数组",则不应使用数组;您可能应该使用List<CustomerDemographic>或其他可以增长的集合类型。

是否尝试将这些CustomerPopulation节点序列化为集合?

为此,请将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