У мене дуже дивна проблема при роботі з .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не очікувалося ... ) буде кинуто.
Хтось може пролити світло на цю тему? Як можна було б займатись і налагоджувати проблему далі?