Tengo un problema muy extraño al trabajar con .NET XmlSerializer
.
Tome 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 el problema InvalidOperationException
causado por el serializador que no conoce los tipos derivados de Payment
.
1. Añadiendo XmlInclude
a la Payment
definición de clase:
Esto no es posible debido a que todas las clases se incluyen como referencias externas sobre las que no tengo control.
2. Pasar los tipos de tipos derivados durante la creación de la XmlSerializer
instancia
No funciona.
3. Definición XmlAttributeOverrides
de la propiedad de destino para anular la serialización predeterminada de la propiedad (como se explica en esta publicación SO )
Tampoco funciona ( XmlAttributeOverrides
sigue la inicialización).
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
Entonces se usaría el constructor apropiado .
NOTA: por no funciona me refiero a que se lanza InvalidOperationException
( BankPayment
no se esperaba ... ).
¿Alguien puede arrojar algo de luz sobre el tema? ¿Cómo se procedería a depurar más el problema?