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?