J'ai un problème très étrange lorsque je travaille avec .NET XmlSerializer.
Prenez les exemples de classes suivants:
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, il existe trois méthodes différentes pour résoudre le problème InvalidOperationExceptioncausé par le sérialiseur ne sachant pas les types dérivés de Payment.
1. Ajout XmlIncludeà la Paymentdéfinition de classe:
Cela n'est pas possible car toutes les classes sont incluses en tant que références externes sur lesquelles je n'ai aucun contrôle.
2. Passer les types des types dérivés lors de la création de l' XmlSerializerinstance
Ça ne marche pas.
3. Définition XmlAttributeOverridesde la propriété cible afin de remplacer la sérialisation par défaut de la propriété (comme expliqué dans cet article SO )
Ne fonctionne pas non plus (l' XmlAttributeOverridesinitialisation suit).
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);Le XmlSerializerconstructeur approprié serait alors utilisé.
REMARQUE: par ne fonctionne pas, je veux dire que le InvalidOperationException( BankPaymentn'était pas prévu ... ) est lancé.
Quelqu'un peut-il faire la lumière sur le sujet? Comment procéder et déboguer davantage le problème?