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.