serialize serializar objeto net deserialize deserializar c# .net xml xmlserializer

objeto - serializar y deserializar xml c#



Utilice el atributo XmlInclude o SoapInclude para especificar tipos que no se conocen de forma estática (2)

Tengo un problema muy extraño cuando trabajo con XmlSerializer de .NET.

Toma las siguientes clases de ejemplo:

public class Order { public PaymentCollection Payments { get; set; } //everything else is serializable (including other collections of non-abstract types) } public class PaymentCollection : Collection<Payment> { } public abstract class Payment { //abstract methods } public class BankPayment : Payment { //method implementations }

AFAIK, hay tres métodos diferentes para resolver la InvalidOperationException causada por el serializador sin conocer los tipos de Payment derivados.

1. Agregar XmlInclude a la definición de clase de Payment :

Esto no es posible debido a que todas las clases se incluyen como referencias externas sobre las cuales no tengo control.

2. Pasar los tipos de tipos derivados durante la creación de la instancia de XmlSerializer

No funciona

3. Definir XmlAttributeOverrides para la propiedad de destino para anular la serialización predeterminada de la propiedad (como se explica en esta publicación de SO )

Tampoco funciona (sigue la inicialización de XmlAttributeOverrides ).

Type bankPayment = typeof(BankPayment); XmlAttributes attributes = new XmlAttributes(); attributes.XmlElements.Add(new XmlElementAttribute(bankPayment.Name, bankPayment)); XmlAttributeOverrides overrides = new XmlAttributeOverrides(); overrides.Add(typeof(Order), "Payments", attributes);

XmlSerializer se XmlSerializer constructor de XmlSerializer apropiado.

NOTA: por no funciona me refiero a que se InvalidOperationException ( no se esperaba BankPayment ... ).

¿Alguien puede arrojar algo de luz sobre el tema? ¿Cómo se podría seguir y depurar el problema más?


Acabo de resolver el problema. Después de buscar por un tiempo más, encontré esta publicación SO que cubre exactamente la misma situación. Me puso en el camino correcto.

Básicamente, XmlSerializer necesita conocer el espacio de nombres predeterminado si las clases derivadas se incluyen como tipos adicionales. Todavía se desconoce el motivo exacto por el que esto tiene que pasar, pero, aún así, la serialización está funcionando ahora.


Esto funcionó para mí:

[XmlInclude(typeof(BankPayment))] [Serializable] public abstract class Payment { } [Serializable] public class BankPayment : Payment {} [Serializable] public class Payments : List<Payment>{} XmlSerializer serializer = new XmlSerializer(typeof(Payments), new Type[]{typeof(Payment)});