Verwenden Sie das Attribut XmlInclude oder SoapInclude, um Typen anzugeben, die statisch nicht bekannt sind

Ich habe ein sehr seltsames Problem, wenn ich mit .NET arbeiteXmlSerializer.

Nehmen Sie die folgenden Beispielklassen:

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, es gibt drei verschiedene Methoden, um die zu lösenInvalidOperationException Dies wird dadurch verursacht, dass der Serializer die abgeleiteten Typen von nicht kenntPayment.

1. HinzufügenXmlInclude zumPayment Klassendefinition:

Dies ist nicht möglich, da alle Klassen als externe Referenzen aufgenommen wurden, auf die ich keinen Einfluss habe.

2. Übergeben der Typen der abgeleiteten Typen während der Erstellung desXmlSerializer Beispiel

Funktioniert nicht

3. DefinierenXmlAttributeOverrides für die Zieleigenschaft, um die Standard - Serialisierung der Eigenschaft zu überschreiben (wie indieser SO Beitrag)

Funktioniert auch nicht (XmlAttributeOverrides Initialisierung folgt).

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);

Der angemesseneXmlSerializer Dann würde der Konstruktor verwendet.

HINWEIS: vonfunktioniert nicht Ich meine dasInvalidOperationException (BankPayment wurde nicht erwartet ...) ist geworfen.

Kann jemand etwas Licht in das Thema bringen? Wie würde man vorgehen und das Problem weiter beheben?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage