Mam bardzo dziwny problem podczas pracy z .NET XmlSerializer.
Weź następujące przykładowe zajęcia:
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, istnieją trzy różne metody rozwiązania problemu InvalidOperationExceptionspowodowanego brakiem wiedzy serializatora o typach pochodnych Payment.
1. Dodanie XmlIncludedo Paymentdefinicji klasy:
Nie jest to możliwe, ponieważ wszystkie klasy są uwzględnione jako odwołania zewnętrzne, nad którymi nie mam kontroli.
2. Przekazywanie typów typów pochodnych podczas tworzenia XmlSerializerinstancji
Nie działa.
3. Definiowanie XmlAttributeOverrideswłaściwości docelowej w celu zastąpienia domyślnej serializacji właściwości (jak wyjaśniono w tym poście SO )
Również nie działa ( XmlAttributeOverridesnastępuje inicjalizacja).
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);
XmlSerializerNastępnie zostanie użyty odpowiedni konstruktor.
UWAGA: przez nie działa, mam na myśli, że InvalidOperationException( BankPaymentnie oczekiwano ... ) jest rzucany.
Czy ktoś może rzucić trochę światła na ten temat? Jak można by zająć się i dalej debugować problem?