C# 反序列化CDATA时集合为只读异常

C# 反序列化CDATA时集合为只读异常,c#,cdata,xml-deserialization,C#,Cdata,Xml Deserialization,我想反序列化包含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> 我的用户类如下所示

我想反序列化包含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>
我的用户类如下所示:

[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;
        }
    }
}

我认为您可能希望调用
ToList
而不是
ToArray

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

谢谢您的回答,但它对ToList的作用与对ToArray的作用相同。
[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."