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 InvalidOperationExceptioncausado por el serializador que no conoce los tipos derivados de Payment.
1. Añadiendo XmlIncludea la Paymentdefinició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 XmlSerializerinstancia
No funciona.
3. Definición XmlAttributeOverridesde la propiedad de destino para anular la serialización predeterminada de la propiedad (como se explica en esta publicación SO )
Tampoco funciona ( XmlAttributeOverridessigue 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);
XmlSerializerEntonces se usaría el constructor apropiado .
NOTA: por no funciona me refiero a que se lanza InvalidOperationException( BankPaymentno se esperaba ... ).
¿Alguien puede arrojar algo de luz sobre el tema? ¿Cómo se procedería a depurar más el problema?