[英]To be XML serializable, types which inherit from IEnumerable must have an implementation of Add(System.Object)
[英]Why does XmlSerializer require types which inherit from IEnumerable to have an implementation of Add(System.Object)?
我正在使用xml序列化,但现在遇到了一个之前未见的运行时错误。
“要成为可序列化的XML,从IEnumerable继承的类型必须在其继承层次结构的所有级别上都具有Add(System.Object)的实现。ImageEditor.EffectOptions不实现Add(System.Object)”
似乎被迫通过运行时异常来实现方法,而不是编译时错误(如已实现的接口缺少方法)有点奇怪。
这是设计使然吗? 是否不应该通过某种接口(例如XmlSerializable
等)来强制执行此操作?
除此之外,我想知道序列化程序是否保证传递正确类型的值,在这里我可以将其EffectOption
转换为该类型,在我的情况下为EffectOption
。
还是应该实现此Add (object)
方法以查看对象是否为EffectOption
类型,并且是否不引发异常?
我之前没有实现过这个Add (object)
方法,但是我猜测将它EffectOptions
为EffectOption
并将其添加到EffectOptions
集合会更安全。
编辑:这是类型本身:
public class EffectOptions : IEnumerable<EffectOption>
{
public List<EffectOption> Options { get; private set; }
//IEnumerable methods
}
因为子类由于基类而隐式地实现了接口方法,但是xmlserializer使用的是反射,这就是为什么在运行时而不是编译时得到错误的原因。
尝试明确实现,看看会发生什么。 之前我没有遇到过这个问题,所以除非您执行自定义操作,否则我不确定为什么会这样。
如果您的子类显式实现了接口但不执行任何实现代码(发生方法的隐式实现),请从子类型声明中删除接口,因为由于基本类型的原因,该接口仍然有效。 (有人告诉我我是否要离开这里)
我刚刚遇到这个问题,并通过添加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
}
我希望这有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.