我有一个对象,它包含一个被定义为IEnumerable的对象,即
[Serializable]
[XmlRoot("MyObject")]
public class MyObject
{
[XmlAttribute]
public string Name { get; set; }
[XmlArrayAttribute("Numbers")]
public IEnumerable<string> Numbers { get; set; }
}
当我对对象运行XmlSerializer.Serialize时,即
MyObject myObject = new MyObject() {
Name = "My Name" ,
Numbers= new List<string>(){"One", "Two"}
};
var xmlSerializer = XmlSerializer.FromTypes(new[]
{ typeof(MyObject) })[0];
using (var xmlWriter = XmlWriter.Create(@"MyObject.xml"))
{
if (xmlWriter != null) xmlSerializer.Serialize(xmlWriter, myObject);
}
我得到了
“无法序列化成员 SerializeObjects.MyObject.Numbers of 类型 System.Collections.Generic.IEnumerable`1 [System.String, mscorlib,版本= 2.0.0.0, 文化=中性, 公钥= b77a5c561934e089]] 因为它是一个界面。“
据我所知,您无法序列化界面。
现在提出问题:
“公共IEnumerable Numbers {get; set;}”的最佳声明是什么?
我应该使用List<>
,如果不是,为什么不呢?
答案 0 :(得分:8)
一般而言,如果您希望班级用户可以自由修改,则应使用Collection<T>
;如果不打算,则ReadOnlyCollection<T>
。建议不要在公共接口(source)中使用List<T>
。
但是,由于此类用于XML序列化,因此可能不用于将XML表示为对象模型之外的任何其他目的,因此规则实际上并不像“普通”API那样适用,因为它除了XmlSerializer
之外,没有消费者,所以你使用的东西并不重要。我可能仍然坚持这些建议。
答案 1 :(得分:1)
如果你不介意列表是可编辑的,即公开添加/删除,那么List<>
就可以了。否则,您应该使用ReadOnlyCollection