Ho un problema molto strano quando lavoro con .NET XmlSerializer.
Prendi le seguenti classi di esempio:
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
}
Per quanto ne so, ci sono tre diversi metodi per risolvere il problema InvalidOperationExceptioncausato dal serializzatore che non conosce i tipi derivati di Payment.
1. Aggiunta XmlIncludealla Paymentdefinizione della classe:
Ciò non è possibile perché tutte le classi sono incluse come riferimenti esterni su cui non ho alcun controllo.
2. Passaggio dei tipi di tipi derivati durante la creazione XmlSerializerdell'istanza
Non funziona
3. Definizione XmlAttributeOverridesdella proprietà di destinazione per sovrascrivere la serializzazione predefinita della proprietà (come spiegato in questo post SO )
Inoltre non funziona ( XmlAttributeOverridessegue l'inizializzazione).
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);
Verrà XmlSerializerquindi utilizzato il costruttore appropriato .
NOTA: per non funziona intendo che InvalidOperationException( BankPaymentnon era previsto ... ) viene lanciato.
Qualcuno può far luce sull'argomento? Come si potrebbe procedere ed eseguire il debug ulteriormente del problema?