Użyj atrybutu XmlInclude lub SoapInclude, aby określić typy, które nie są znane statycznie

Mam bardzo dziwny problem podczas pracy z .NETXmlSerializer.

Weź następujące przykładowe klasy:

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ązaniaInvalidOperationException Jest to spowodowane tym, że serializator nie wie o pochodnych typachPayment.

1. DodawanieXmlInclude doPayment definicja klasy:

Nie jest to możliwe, ponieważ wszystkie klasy są włączone jako odniesienia zewnętrzne, nad którymi nie mam kontroli.

2. Przekazywanie typów typów pochodnych podczas tworzeniaXmlSerializer instancja

Nie działa

3. DefiniowanieXmlAttributeOverrides dla właściwości target w celu zastąpienia domyślnej serializacji właściwości (jak wyjaśniono wten post SO)

Również nie działa (XmlAttributeOverrides inicjalizacja następuje).

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

WłaściwyXmlSerializer użyty zostanie konstruktor.

UWAGA: przeznie działa Mam na myśliInvalidOperationException (BankPayment nie spodziewano się ...) Jest rzucony.

Czy ktoś może rzucić trochę światła na ten temat? Jak poradzić sobie i debugować problem dalej?

questionAnswers(2)

yourAnswerToTheQuestion