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

Tengo un problema muy extraño al trabajar con .NETXmlSerializer.

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 elInvalidOperationException eso se debe a que el serializador no conoce los tipos derivados dePayment.

1. AgregandoXmlInclude alPayment 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. Pasando los tipos de tipos derivados durante la creación delXmlSerializer ejemplo

No funciona

3. DefiniendoXmlAttributeOverrides para la propiedad de destino con el fin de anular la serialización predeterminada de la propiedad (como se explica eneste mensaje SO)

Tampoco funciona (XmlAttributeOverrides La inicialización sigue).

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);

La ApropiadaXmlSerializer entonces se usaría el constructor.

NOTA: porno funciona Me refiero alInvalidOperationException (BankPayment no se esperaba ...) es aventado.

¿Alguien puede arrojar algo de luz sobre el tema? ¿Cómo se podría tratar de solucionar el problema?

Respuestas a la pregunta(2)

Su respuesta a la pregunta