Ich habe ein sehr seltsames Problem bei der Arbeit mit .NETs XmlSerializer
.
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 das Problem zu lösen InvalidOperationException
, das dadurch verursacht wird, dass der Serializer die abgeleiteten Typen von nicht kennt Payment
.
1. Hinzufügen XmlInclude
zur Payment
Klassendefinition:
Dies ist nicht möglich, da alle Klassen als externe Referenzen enthalten sind, über die ich keine Kontrolle habe.
2. Übergeben der Typen der abgeleiteten Typen während der Erstellung der XmlSerializer
Instanz
Funktioniert nicht
3. Definieren XmlAttributeOverrides
der Zieleigenschaft, um die Standardserialisierung der Eigenschaft zu überschreiben (wie in diesem SO-Beitrag erläutert ).
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 entsprechende XmlSerializer
Konstruktor würde dann verwendet.
HINWEIS: Mit funktioniert nicht Ich meine, das InvalidOperationException
( BankPayment
wurde nicht erwartet ... ) wird geworfen.
Kann jemand etwas Licht in das Thema bringen? Wie würde man vorgehen und das Problem weiter debuggen?