c# - 接口(interface) "not marked with serializable attribute"异常

标签 c# exception serialization interface

我的 C# 应用程序中有一个非常奇怪的异常:当尝试反序列化包含通用 List<IListMember> 的类时(其中列表条目由接口(interface)指定),抛出异常报告“类型 ...IListMember 未标记可序列化属性”(措辞可能略有不同,我的 VisualStudio 不是英文的)。

现在,接口(interface)不能是可序列化的;实际包含在列表中的类,实现 IListMember, [Serializable] ;是的,我检查过 IListMember实际上被定义为一个接口(interface)而不是意外地定义为一个类!

我已经尝试在一个单独的测试项目中重现异常,该项目仅包含包含列表和成员的类,但它在那里愉快地序列化和反序列化:/

有没有人对它可能是什么有什么好的想法?

编辑:

我们正在使用 BinarySerializer ;我重复一遍,当提取到测试项目时,该类会愉快地序列化。所以我不需要解决方法来序列化包含 List<IThing> 的类,一般来说这很好用(只要实现 IThing 的实际类是可序列化的);我正在寻找的是它可能在这个特定时间工作的原因......

我现在已经提出了一个解决方法(单独序列化每个列表成员,连同条目数,并手动重新创建 List),但我真的很想找出它可能是什么以供将来引用。

最佳答案

支持接口(interface)的类是否可序列化并不重要。接口(interface)不能序列化,句号。

为了反序列化,序列化器需要能够实例化具体类型,它通过反射(reflect)要反序列化的类的字段/属性来确定这种类型。

如果其中一个属性的类型是一个接口(interface),那么它将永远无法构造一个具体类型来分配给该成员。它看到的只是接口(interface),它不知道数据序列化时最初是哪个类实现的。

如果您希望类是可序列化的,那么对象图中的每个类都必须是具体类型。不允许接口(interface)。

(后记:实际上,我有点撒谎,BinaryFormatter 可以直接序列化/反序列化到/从接口(interface)类型,但我强烈怀疑这不是这里使用的。)

关于c# - 接口(interface) "not marked with serializable attribute"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2694866/

相关文章:

c# - Mono 网络服务和基本身份验证

python - 无法捕获线程程序中的异常

wcf - 过错还是不过错

c++ - LWG2349 会有什么影响?

java - 反序列化 bean 需要范围依赖

c++ - C++中流接口(interface)的问题

c# - 使用 Json.Net 序列化模型时自动 HtmlEncode 字符串

c# - 为什么不是 DbConnection 而不是 SqlConnection 或 OracleConnection?

c# - 将 bytes[] 转换为文字字符串

c# - 无效字符错误SQL,OracleDataReader