serialize serializar example deserializar c# xml-serialization xmlserializer

c# - serializar - xmlserializer javascript



XmlSerializer no serializará IEnumerable (7)

Tengo un registrador de invocación que está destinado a registrar todas las llamadas al método junto con los parámetros asociados con el método que usa XmlSerializer. Funciona bien para la mayoría de las llamadas, pero arroja una excepción para todos los métodos que tienen un parámetro de tipo IEnumerable .

Por ejemplo, void MethodWithPlace( Place value ) se serializaría, pero no lo void MethodWithPlace( IEnumerable<Place> value ) .

La excepción es

System.NotSupportedException: No se puede serializar la interfaz System.Collections.Generic.IEnumerable`1 [[Place, Test, Version = 0.0.0.0, Culture = neutral]].

¿Qué debo hacer para que funcione con esos métodos con IEnumerable como uno de sus parámetros?


Básicamente, un XmlSerializer no puede serializar una interfaz. La solución, entonces, es darle una instancia concreta para serializar. Dependiendo de cómo funciona su registrador de invocación, consideraría usar

var serializer = new XmlSerializer(value.GetType());


La forma en que serializa una propiedad IEnumerable es con una propiedad sustituta

[XmlRoot] public class Entity { [XmlIgnore] public IEnumerable<Foo> Foo { get; set; } [XmlElement, Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public List<Foo> FooSurrogate { get { return Foo.ToList(); } set { Foo = value; } } }

Es feo, pero hace el trabajo bien. La mejor solución es escribir una clase sustituta (es decir, EntitySurrogate).


No creo que puedas serializar eso. Intenta convertir IEnumerable en una lista y luego podrás serializar.


Para ser XML serializable, los tipos que heredan de IEnumerable deben tener una implementación de Add (System.Object) en todos los niveles de su jerarquía de herencia. {su clase} no implementa Add (System.Object).

implementar la función Agregar (), puede que resuelva el problema


Puede usar DataContractSerializer

using (var ms = new MemoryStream()) { var serialiser = new DataContractSerializer(typeof (EnvironmentMetadata)); serialiser.WriteObject(ms, environmentMetadata); var s = Encoding.ASCII.GetString(ms.ToArray()); return s; }


Tal vez no sea la mejor manera, pero funcionó para mí. Creé un método que hace serialización.

Utilizar

var xml = Util.ObjetoToXML (obj, null, null) .OuterXml;

método

public static XmlDocument ObjetoToXML(object obj, XmlDocument xmlDocument, XmlNode rootNode) { if (xmlDocument == null) xmlDocument = new XmlDocument(); if (obj == null) return xmlDocument; Type type = obj.GetType(); if (rootNode == null) { rootNode = xmlDocument.CreateElement(string.Empty, type.Name, string.Empty); xmlDocument.AppendChild(rootNode); } if (type.IsPrimitive || type == typeof(Decimal) || type == typeof(String) || type == typeof(DateTime)) { // Simples types if (obj != null) rootNode.InnerText = obj.ToString(); } else if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>)) { // Genericis types XmlNode node = null; foreach (var item in (IEnumerable)obj) { if (node == null) { node = xmlDocument.CreateElement(string.Empty, item.GetType().Name, string.Empty); node = rootNode.AppendChild(node); } ObjetoToXML(item, xmlDocument, node); } } else { // Classes types foreach (var propertie in obj.GetType().GetProperties()) { XmlNode node = xmlDocument.CreateElement(string.Empty, propertie.Name, string.Empty); node = rootNode.AppendChild(node); var valor = propertie.GetValue(obj, null); ObjetoToXML(valor, xmlDocument, node); } } return xmlDocument; }


XmlSerializer no es compatible con esto. Pruebe YAXLib para estas serializaciones de tipos.