xmlelementattribute xmlattribute serialize newtonsoft example serialization interface

serialization - xmlattribute - Serializar objetos utilizando objetos xmlSerializer.Serialize e IEnumerable



xml serialization c# (2)

En términos generales, debe utilizar 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 ( fuente ).

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

Tengo un objeto que contiene un objeto que se define como IEnumerable, es decir,

[Serializable] [XmlRoot("MyObject")] public class MyObject { [XmlAttribute] public string Name { get; set; } [XmlArrayAttribute("Numbers")] public IEnumerable<string> Numbers { get; set; } }

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

yo obtengo

"No se puede serializar el miembro SerializeObjects.MyObject.Numbers de tipo System.Collections.Generic.IEnumerable`1 [[System.String, mscorlib, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]] porque es una interfaz."

Lo cual entiendo es que no puedes serializar una interfaz.

Ahora para la pregunta:

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

¿Debo usar List<> Si no, ¿por qué no?


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