繁体   English   中英

为什么XmlSerializer要求从IEnumerable继承的类型具有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)方法,但是我猜测将它EffectOptionsEffectOption并将其添加到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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM