【问题标题】:XmlSerializer sets array property isFixedSize to trueXmlSerializer 将数组属性 isFixedSize 设置为 true
【发布时间】:2012-02-09 11:20:35
【问题描述】:

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

任何关于如何解决这个问题以及为什么会发生这种情况的帮助都会很棒。

【问题讨论】:

  • 您是否尝试将这些 CustomerDemographic 节点序列化为一个集合?
  • 你是什么意思?使用泛型而不是数组?

标签: c# asp.net serialization xml-serialization


【解决方案1】:

IsFixedSizealways true for an array。如果您“需要在以后手动添加到此数组”,则不应使用数组;您可能应该使用List&lt;CustomerDemographic&gt;,或其他可以增长的集合类型。

【讨论】:

  • 现在说得通了,你总是必须在初始化数组时给它一个长度。感谢您指出这一点!
【解决方案2】:

您是否尝试将这些 CustomerDemographic 节点序列化为一个集合?

为此,请将typeof(CustomerDemographic) 更改为typeof(List&lt;CustomerDemographic&gt;)。 那么您将能够更改该集合中的项目。或者:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 2015-03-29
    • 2013-12-04
    相关资源
    最近更新 更多