使用xmlSerializer.Serialize和IEnumerable对象序列化对象

时间:2010-04-28 13:35:45

标签: serialization interface

我有一个对象,它包含一个被定义为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<>,如果不是,为什么不呢?

2 个答案:

答案 0 :(得分:8)

一般而言,如果您希望班级用户可以自由修改,则应使用Collection<T>;如果不打算,则ReadOnlyCollection<T>。建议不要在公共接口(source)中使用List<T>

但是,由于此类用于XML序列化,因此可能不用于将XML表示为对象模型之外的任何其他目的,因此规则实际上并不像“普通”API那样适用,因为它除了XmlSerializer之外,没有消费者,所以你使用的东西并不重要。我可能仍然坚持这些建议。

答案 1 :(得分:1)

如果你不介意列表是可编辑的,即公开添加/删除,那么List<>就可以了。否则,您应该使用ReadOnlyCollection