c# - 为什么 XmlSerializer 要求从 IEnumerable 继承的类型具有 Add(System.Object) 的实现?

标签 c# .net exception serialization ienumerable

我正在使用 xml 序列化,但现在遇到了一个我以前从未见过的运行时错误。

"To be XML serializable, types which inherit from IEnumerable must have an implementation of Add(System.Object) at all levels of their inheritance hierarchy. ImageEditor.EffectOptions does not implement Add(System.Object)"

通过运行时异常强制实现一个方法似乎有点奇怪,而不是编译时错误,例如缺少已实现接口(interface)的方法。

这是设计使然吗?这不应该通过某种接口(interface)(如 XmlSerializable 等)来强制执行吗?

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

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

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

编辑:这是类型本身:

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

    //IEnumerable methods
}

最佳答案

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

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

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

关于c# - 为什么 XmlSerializer 要求从 IEnumerable 继承的类型具有 Add(System.Object) 的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5172757/

相关文章:

c# - 关联表和 Linq to Sql

c# - VB.net 中奇怪的调试器行为

c# - 在转换为 "out/ref"的表达式中支持 "object"参数

c# - 从音频文件C#中提取信息

C# 以我以前从未见过的独特格式解析日期/时间

.net - Linq从整数列表中选择多个ID(主键)

c# - 我们可以在c#中的datatable.select中添加参数吗

.net - 在 .NET 核心中查找 2 个坐标之间的距离

c++ - 我怎么知道确切的异常类型?

java - 如何解决 java.lang.NoClassDefFoundError?