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

Cop*_*ill 11 serialization interface

我有一个对象,其中包含一个被定义为IEnumerable的对象,即

[Serializable]
[XmlRoot("MyObject")]
public class MyObject
{
    [XmlAttribute]
    public string Name { get; set; }

    [XmlArrayAttribute("Numbers")]
    public IEnumerable<string> Numbers { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

当我对对象运行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);
            }
Run Code Online (Sandbox Code Playgroud)

我明白了

"无法序列化System.Collections.Generic.IEnumerable`1 [[System.String,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]类型的成员SerializeObjects.MyObject.Numbers,因为它是一个接口."

据我所知,您无法序列化界面.

现在提问:

什么是"公共IEnumerable Numbers {get; set;}"的最佳声明?

我应该使用List<>,如果不是,为什么不呢?

Gre*_*ech 8

一般而言,Collection<T>如果您希望您的班级用户可以自由修改它,或者ReadOnlyCollection<T>如果您不这样做,则应该使用.不建议List<T>在公共接口()中使用.

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