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 InvalidOperationException
spowodowanego brakiem wiedzy serializatora o typach pochodnych Payment
.
1. Dodanie XmlInclude
do Payment
definicji 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 XmlSerializer
instancji
Nie działa.
3. Definiowanie XmlAttributeOverrides
wł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 ( XmlAttributeOverrides
nastę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);
XmlSerializer
Następnie zostanie użyty odpowiedni konstruktor.
UWAGA: przez nie działa, mam na myśli, że InvalidOperationException
( BankPayment
nie oczekiwano ... ) jest rzucany.
Czy ktoś może rzucić trochę światła na ten temat? Jak można by zająć się i dalej debugować problem?