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

Joa*_*nge 8 .net c# ienumerable serialization exception

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

"要进行XML可序列化,从IEnumerable继承的类型必须在其继承层次结构的所有级别都具有Add(System.Object)的实现.ImageEditor.EffectOptions不实现Add(System.Object)"

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

这是设计的吗?这不应该通过某种类型的界面强制执行XmlSerializable吗?

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

或者我应该实现此Add (object)方法以查看对象是否类型EffectOption,如果没有抛出异常?

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

编辑:这是类型本身:

public class EffectOptions : IEnumerable<EffectOption>
{
    public List<EffectOption> Options { get; private set; }

    //IEnumerable methods
}
Run Code Online (Sandbox Code Playgroud)

Dus*_*vis 3

因为子类由于基类而隐式实现接口方法,但 xmlserializer 使用反射,这就是为什么您在运行时而不是编译时收到错误。

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

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