2011-03-02 62 views
8

我正在使用xml序列化,但现在遇到了一个我从未见过的运行时错误。为什么XmlSerializer需要从IEnumerable继承的类型来实现Add(System.Object)?

“要XML序列化,从IEnumerable的 继承必须在其继承各级 层次。ImageEditor.EffectOptions 没有实现添加有 实施加(System.Object的) 类型(系统.Object)“

似乎有点奇怪,被迫通过运行时异常实现一个方法,而不是编译时间错误,如从实现的接口中缺少方法。

这是设计吗?如果这不是通过像XmlSerializable等某种接口强制执行的?

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

或者我应该执行这个Add (object)方法来查看对象是否是EffectOption类型,如果不抛出异常?

我之前没有实现过这个Add (object)方法,但我猜想把它投到EffectOption并将其添加到EffectOptions集合会更安全。

编辑:这里的类型本身:

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

    //IEnumerable methods 
} 

回答

3

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

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

如果你有你的子类显式实现接口,但没有做任何实现代码(让方法的隐式实现发生),然后从你的子类型声明中删除接口,因为它应该仍然是有效的,因为你的基类型。 (有人告诉我,如果我在这里是关)

+0

谢谢,但你是什么意思的子类?我的类型不是从任何其他类型派生的,它只是实现IEnumerable。 – 2011-03-02 20:08:32

+0

你可以发布带有方法存根的类吗? – 2011-03-02 20:09:46

+0

将代码添加到问题中。 – 2011-03-02 20:13:40

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 
} 

我希望这有助于。

相关问题