最佳答案
在使用.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,有三种不同的方法来解决由序列化程序不知道 Payment
的派生类型所引起的 InvalidOperationException
。
1. 将 XmlInclude
添加到 Payment
类定义中:
这是不可能的,因为所有的类都包含在外部引用中,我对它们没有控制权。
2. Passing the derived types' types during creation of the XmlSerializer
instance
Doesn't work.
3. 为目标属性定义 XmlAttributeOverrides
,以覆盖该属性的默认序列化(如 这个职位中所解释的)
也不起作用(随后进行 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
没有预料到..。)。
有人能就这个问题提供一些解释吗? 人们如何进一步调试这个问题呢?