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 InvalidOperationException
causato dal serializzatore che non conosce i tipi derivati di Payment
.
1. Aggiunta XmlInclude
alla Payment
definizione 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 XmlSerializer
dell'istanza
Non funziona
3. Definizione XmlAttributeOverrides
della proprietà di destinazione per sovrascrivere la serializzazione predefinita della proprietà (come spiegato in questo post SO )
Inoltre non funziona ( XmlAttributeOverrides
segue 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à XmlSerializer
quindi utilizzato il costruttore appropriato .
NOTA: per non funziona intendo che InvalidOperationException
( BankPayment
non era previsto ... ) viene lanciato.
Qualcuno può far luce sull'argomento? Come si potrebbe procedere ed eseguire il debug ulteriormente del problema?