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

时间:2011-03-02 20:05:08

标签: c# .net exception serialization ienumerable

我正在使用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
}

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

public class EffectOptions : IEnumerable<EffectOption>
{
    public List<EffectOption> 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
}

我希望这会有所帮助。