【问题标题】:Why does XmlSerializer require types which inherit from IEnumerable to have an implementation of Add(System.Object)?为什么 XmlSerializer 需要从 IEnumerable 继承的类型才能实现 Add(System.Object)?
【发布时间】:2011-03-02 20:05:07
【问题描述】:

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

【问题讨论】:

    标签: c# .net exception serialization ienumerable


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,但是子类是什么意思?我的类型不是从任何其他类型派生的,它只是实现了 IEnumerable。
    • 你能发布带有方法存根的类吗?
    • 为什么不将你的类声明为公共类 EffectOptions : List ?它会解决你的问题。我假设您出于设计原因没有这样做。
    • 谢谢,如果我这样做,那么我继承了列表的所有功能,对吗?我希望选项简单而不暴露。它只允许您创建和枚举值,所以它非常基础。
    • 它会做和你现在做的一样的事情,只是没有 options 属性。如果您想实现自定义集合,IMO 这就是我会做的事情(这就是我所做的)。无论如何,选项都是一个列表,您只是在阻止设置参考。
    【解决方案2】:

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

    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
    }
    

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-05-26
      • 2016-10-24
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 2014-03-17
      • 1970-01-01
      相关资源
      最近更新 更多