我正在使用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
}
答案 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
}
我希望这会有所帮助。