C# 反序列化CDATA时集合为只读异常
我想反序列化包含CDATA集合的序列化XML XML如下所示: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> 我的用户类如下所示
<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."