【问题标题】:Collection is read-only exception while deserializing CDATA反序列化 CDATA 时集合是只读异常
【发布时间】:2012-08-30 14:46:10
【问题描述】:

我想反序列化包含 CDATA 集合的序列化 XML。

XML 看起来像这样:

<User Index="1">
   <Address><![CDATA[My street 1, 1234, My city]]></Address>
   <Address><![CDATA[My next street 1, 5678, My another city]]></Address>
</User>

因为我想直接将新地址添加为这样的字符串:

var user = new User();
user.Addresses.Add("My street 1, 1234, My city");
user.Addresses.Add("My next street 1, 5678, My another city");

我的用户类如下所示:

[XmlRoot("User", IsNullable = true)]
public class User
{
    [XmlIgnore]
    private XmlDocument xmlDoc;

    [XmlIgnore]
    private Collection<string> addresses;

    [XmlIgnore]
    private Collection<XmlNode> addressesNode;

    public User()
    {
        xmlDoc = new XmlDocument();
        addresses = new Collection<string>();
    }

    [XmlAttribute("Index")]
    public int Index { get; set; }

    [XmlElement("Address", IsNullable = true)]
    public Collection<XmlNode> AddressesNode
    {
        get
        {
            // This will create CDATA in address node. String values for
            // CDATA are in addresses collection.
            // This is causing problem.
            return new Collection<XmlNode>(addresses.Select(a => xmlDoc.CreateCDataSection(a)).ToArray());
        }
        set
        {
            // Set also address collection of string to the same values.
            addresses = new Collection<string>(value.Select(a => a.Value).ToArray());

            addressesNode = value;
        }
    }

    [XmlIgnore]
    public Collection<string> Addresses
    {
        get
        {
            return addresses;
        }
    }
}

序列化这个工作正常。但是在反序列化时,抛出异常

 "Collection is read-only."

【问题讨论】:

    标签: c# cdata xml-deserialization


    【解决方案1】:

    当您创建一个将 IList 作为参数传递的新集合时,它会将集合创建为原始列表的包装器。它不会将其复制到新列表(请参阅here)。在您的 addressNode 设置器中,您创建一个新集合作为集合的包装器。您可以改为将其更改为新 List,因为 List 构造函数会创建一个新列表而不是包装原始列表(请参阅here)。

    【讨论】:

      【解决方案2】:

      我想你可能想打电话给ToList 而不是ToArray

      【讨论】:

      • 感谢您的回答,但它对 ToList 的作用与对 ToArray 的作用相同。
      猜你喜欢
      • 2014-06-04
      • 2016-10-08
      • 1970-01-01
      • 2017-11-23
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多