为什么XmlSerializer需要从IEnumerableinheritance的类型具有Add(System.Object)的实现?

我正在使用xml序列化,但现在遇到了一个我以前没见过的运行时错误。

“要成为XML可序列化的,从IEnumerableinheritance的类型必须在其inheritance层次结构的所有级别都具有Add(System.Object)的实现.ImageEditor.EffectOptions不实现Add(System.Object)”

通过运行时exception强制实现方法似乎有点奇怪,而不是编译时间错误,例如实现的接口缺少方法。

这是设计的吗? 这不应该通过某种类型的接口强制执行,如XmlSerializable等?

除此之外,我想知道序列化程序是否保证传递正确类型的值,我可以将其转换为类型,在我的例子中是EffectOption

或者我应该实现这个Add (object)方法来查看对象是否是EffectOption类型,如果没有抛出exception?

我之前没有实现过这个Add (object)方法,但是我的猜测是将它转换为EffectOption并将其添加到EffectOptions集合更安全。

编辑:这是类型本身:

 public class EffectOptions : IEnumerable { public List Options { get; private set; } //IEnumerable methods } 

因为子类因为基类而隐式实现接口方法,但xmlserializer使用reflection,这就是为什么你在运行时得到错误而不是编译时。

尝试明确实施,看看会发生什么。 我之前没有遇到过这个问题,所以我不确定你为什么要这样做,除非你做一些自定义的事情。

如果您的子类显式实现了接口但没有执行任何实现代码(让方法的隐式实现发生),那么从子类型声明中删除接口,因为它应该仍然有效,因为您的基类型。 (有人告诉我,如果我离开这里)

我刚刚遇到这个问题并通过添加add方法解决了这个问题:

 public class EffectOptions : IEnumerable { public List Options { get; private set; } public void Add(object o){ this.Options.Add(o as EffectOption); //you may want to extend the code to check that this cast can be made, //and throw an appropriate error (otherwise it'll add null to your list) } //IEnumerable methods } 

我希望这有帮助。