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?