Используйте атрибут XmlInclude или SoapInclude, чтобы указать типы, которые статически не известны

У меня возникла очень странная проблема при работе с .NETXmlSerializer.

Возьмите следующие примеры классов:

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, есть три разных способа решенияInvalidOperationException это вызвано тем, что сериализатор не знает о производных типахPayment.

1. Adding XmlInclude to the Payment class definition:

Это невозможно из-за того, что все классы включены в качестве внешних ссылок, которые я не могу контролировать.

2. Passing the derived types' types during creation of the XmlSerializer instance

Не работает.

3. Defining XmlAttributeOverrides for the target property in order to override the property's default serialization (as explained in этот ТАК пост)

Также не работает (XmlAttributeOverrides инициализация следует).

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 конструктор будет затем использоваться.

ПРИМЕЧАНИЕ: поdoesn't work Я имею в видуInvalidOperationException (BankPayment was not expected...) брошен.

Кто-нибудь может пролить свет на эту тему? Как можно было бы продолжить и отладить проблему дальше?

Ответы на вопрос(2)

Ваш ответ на вопрос