gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:30:41 24 4
gpt4 key购买 nike

我的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com