121 votes

Utilisez l'attribut XmlInclude ou SoapInclude pour spécifier les types qui ne sont pas connus de manière statique.

J'ai un problème très étrange lorsque je travaille avec le programme .NET. XmlSerializer .

Prenons 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
}

A ma connaissance, il existe trois méthodes différentes pour résoudre le problème de l'utilisation de l'eau. InvalidOperationException cela est dû au fait que le sérialiseur ne connaît pas les types dérivés de l'élément Payment .

1. Ajout de XmlInclude à la Payment définition de la classe :

Cela n'est pas possible car toutes les classes sont incluses comme références externes sur lesquelles je n'ai aucun contrôle.

2. Transmettre les types des types dérivés lors de la création des XmlSerializer instance

Ça ne marche pas.

3. Définir XmlAttributeOverrides pour la propriété cible afin de remplacer la sérialisation par défaut de la propriété (comme expliqué dans la rubrique ce poste SO )

Ne fonctionne pas non plus ( XmlAttributeOverrides l'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);

L'autorité compétente XmlSerializer sera alors utilisé.

NOTE : par ne fonctionne pas Je veux dire le InvalidOperationException ( BankPayment n'était pas prévu... ) est lancé.

Quelqu'un peut-il m'éclairer sur ce sujet ? Comment faire pour déboguer le problème ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X