在使用.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
}
有三种不同的方法来解决由于序列化程序不知道Payment
的派生类型而导致的InvalidOperationException
。
1.向XmlInclude
Payment
类添加定义:
这是不可能的,因为所有的类都包含在我无法控制的外部引用中。
2.在创建 XmlSerializer
实例期间传递派生类型的类型
不起作用。
为了覆盖属性的缺省序列化(如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
不是预期的…)被抛出。
有没有人能说明一下这个问题?如何进一步调试这个问题呢?
发布于 2012-08-10 01:09:41
只是解决了这个问题。在深入研究了更长一段时间后,我发现了this SO post,它涵盖了完全相同的情况。这让我走上了正确的道路。
基本上,如果包含派生类作为额外类型,则XmlSerializer
需要知道默认名称空间。发生这种情况的确切原因尚不清楚,但序列化现在仍在工作。
发布于 2012-11-23 20:23:29
这对我很有效:
[XmlInclude(typeof(BankPayment))]
[Serializable]
public abstract class Payment { }
[Serializable]
public class BankPayment : Payment {}
[Serializable]
public class Payments : List<Payment>{}
XmlSerializer serializer = new XmlSerializer(typeof(Payments), new Type[]{typeof(Payment)});
发布于 2019-06-04 22:43:43
基于this,我能够通过改变我正在使用的XmlSerializer
的构造函数来解决这个问题,而不是改变类。
而不是使用这样的东西(在其他答案中建议):
[XmlInclude(typeof(Derived))]
public class Base {}
public class Derived : Base {}
public void Serialize()
{
TextWriter writer = new StreamWriter(SchedulePath);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Derived>));
xmlSerializer.Serialize(writer, data);
writer.Close();
}
我这样做了:
public class Base {}
public class Derived : Base {}
public void Serialize()
{
TextWriter writer = new StreamWriter(SchedulePath);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Derived>), new[] { typeof(Derived) });
xmlSerializer.Serialize(writer, data);
writer.Close();
}
https://stackoverflow.com/questions/11886290
复制相似问题