У меня очень странная проблема при работе с .NET XmlSerializer
.
Возьмем следующие примеры классов:
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. Добавление XmlInclude
к Payment
определению класса:
Это невозможно из-за того, что все классы включены как внешние ссылки, над которыми я не могу контролировать.
2. Передача типов производных типов при создании XmlSerializer
экземпляра.
Не работает.
3. Определение XmlAttributeOverrides
целевого свойства для отмены сериализации свойства по умолчанию (как описано в этом сообщении SO )
Тоже не работает ( 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
Затем будет использован соответствующий конструктор.
ПРИМЕЧАНИЕ: под не работает, я имею в виду, что InvalidOperationException
( BankPayment
не ожидалось ... ) выбрасывается.
Может ли кто-нибудь пролить свет на эту тему? Как можно дальше отлаживать проблему?