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 InvalidOperationException
causé par le sérialiseur ne sachant pas les types dérivés de Payment
.
1. Ajout XmlInclude
à la Payment
dé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' XmlSerializer
instance
Ça ne marche pas.
3. Définition XmlAttributeOverrides
de 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' XmlAttributeOverrides
initialisation 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 XmlSerializer
constructeur approprié serait alors utilisé.
REMARQUE: par ne fonctionne pas, je veux dire que le InvalidOperationException
( BankPayment
n'é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?