I have an object that holds an object that is definded as IEnumerable, i.e.
[Serializable]
[XmlRoot("MyObject")]
public class MyObject
{
[XmlAttribute]
public string Name { get; set; }
[XmlArrayAttribute("Numbers")]
public IEnumerable<string> Numbers { get; set; }
}
When I run the XmlSerializer.Serialize against the object, i.e.
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);
}
I get
“Cannot serialize member
SerializeObjects.MyObject.Numbers of
type
System.Collections.Generic.IEnumerable`1[[System.String,
mscorlib, Version=2.0.0.0,
Culture=neutral,
PublicKeyToken=b77a5c561934e089]]
because it is an interface.”
Which I understand that you can’t serialize an interface.
Now for the question:
What is the best declaration for the “public IEnumerable Numbers { get; set; }”?
Should I use List<>, if not why not?
In general terms, you should use
Collection<T>if you intend users of your class to be free to modify it, orReadOnlyCollection<T>if you do not. It is not recommended to useList<T>in public interfaces (source).However, as this class is for XML Serialization and thus presumably isn’t used for any purpose other than representing XML as an object model, the rules don’t really apply in the same way as a ‘normal’ API because it will have no consumers other than the
XmlSerializer, and so it doesn’t really matter that much what you use. I’d probably still stick to the recommendations though.