Use o atributo XmlInclude ou SoapInclude para especificar tipos que não são conhecidos estaticamente

Eu tenho um problema muito estranho quando se trabalha com o .NETXmlSerializer.

Tome as seguintes classes de exemplo:

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, existem três métodos diferentes para resolver oInvalidOperationException isso é causado pelo serializador não saber sobre os tipos derivados dePayment.

1. AdicionandoXmlInclude aoPayment definição de classe:

Isso não é possível devido a todas as classes serem incluídas como referências externas sobre as quais não tenho controle.

2. Passando os tipos de tipos derivados durante a criação doXmlSerializer instância

Não funciona.

3. DefinindoXmlAttributeOverrides para a propriedade de destino, a fim de substituir a serialização padrão da propriedade (como explicado emeste post de SO)

Também não funcionaXmlAttributeOverrides inicialização segue).

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

O apropriadoXmlSerializer construtor seria então usado.

NOTA: pornão funciona Quero dizer oInvalidOperationException (BankPayment não era esperado ...) é lançado.

Alguém pode lançar alguma luz sobre o assunto? Como alguém iria e depuraria a questão ainda mais?

questionAnswers(2)

yourAnswerToTheQuestion