2010-04-28 14 views
11

I tener un objeto que contiene un objeto que se definded como IEnumerable, es decirObjetos serializar utilizando xmlSerializer.Serialize y objetos IEnumerable

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

    [XmlArrayAttribute("Numbers")] 
    public IEnumerable<string> Numbers { get; set; } 
} 

Cuando funciono el XmlSerializer.Serialize contra el objeto, es decir,

 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); 
      } 

me sale

"no se puede serializar miembros SerializeObjects.MyObject.Numbers de tipo System.Collections.Generic.IEnumerable`1 [[System.String, mscorlib, versión = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]] porque es una interfaz ".

Que entiendo que no puede serializar una interfaz.

Ahora la pregunta:

¿Cuál es la mejor declaración de los "números públicos IEnumerable {get; set;}"?

Debo usar List<>, de lo contrario ¿por qué no?

Respuesta

8

En términos generales, debe usar Collection<T> si desea que los usuarios de su clase puedan modificarlo libremente, o ReadOnlyCollection<T> si no lo hace. No se recomienda utilizar List<T> en interfaces públicas (source).

Sin embargo, como esta clase es para Serialización XML y probablemente no se usa para ningún propósito que no sea representar XML como un modelo de objeto, las reglas realmente no se aplican de la misma manera que una API 'normal' porque no tendrá más consumidores que el XmlSerializer, por lo que en realidad no importa tanto lo que usa. Sin embargo, aún me apegaría a las recomendaciones.

1

Si no te importa que la lista sea editable, es decir, agregar/eliminar públicamente, entonces List<> estaría bien. De lo contrario, debe usar ReadOnlyCollection

Cuestiones relacionadas