使用.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 post中所述)
也不起作用(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
没想到...)被抛出。
谁能阐明这个问题?人们将如何进行进一步的调试?