Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 接口“;未使用可序列化属性标记";例外_C#_Exception_Serialization_Interface - Fatal编程技术网

C# 接口“;未使用可序列化属性标记";例外

C# 接口“;未使用可序列化属性标记";例外,c#,exception,serialization,interface,C#,Exception,Serialization,Interface,在我的C#应用程序中有一个非常奇怪的异常:当尝试反序列化包含泛型列表的类时(其中列表项由接口指定),抛出一个异常,报告“type…IListMember没有用serializable属性标记”(措辞可能略有不同,我的VisualStudio不是用英语) 现在,接口无法序列化;列表中实际包含的实现IListMember的类是[Serializable];是的,我已经检查过IListMember实际上定义为接口,而不是意外地定义为类 我曾尝试在一个单独的测试项目中复制异常,该项目只包含包含列表和成员

在我的C#应用程序中有一个非常奇怪的异常:当尝试反序列化包含泛型
列表的类时(其中列表项由接口指定),抛出一个异常,报告“type…IListMember没有用serializable属性标记”(措辞可能略有不同,我的VisualStudio不是用英语)

现在,接口无法序列化;列表中实际包含的实现IListMember的类是
[Serializable]
;是的,我已经检查过
IListMember
实际上定义为接口,而不是意外地定义为类

我曾尝试在一个单独的测试项目中复制异常,该项目只包含包含列表和成员的类,但在那里它可以序列化和反序列化:/

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

编辑:

我们使用的是一个
二进制序列化程序
;我重复一遍,当提取到测试项目中时,该类会愉快地序列化。因此,我不需要一个变通方法来序列化包含
列表的类,因为一般来说,这可以很好地工作(只要实现
的实际类是可序列化的);我要寻找的是它在这个特定时间可能不起作用的原因

现在,我已经采取了一种变通方法(将每个列表成员单独序列化,以及条目的数量,并手动重新创建
列表),但我真的很想知道它可能是什么,以供将来参考。

简单的方法(尽管很难看)包装列表:

public ListMemberCollection : List<IListMember>, ISerializable
{
    // Implement ISerializable Here
}
可能性?:(在你的另一节课上)

对正在序列化的类进行分类
{
[可序列化]
公共列表{get;set;}
}

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

为了反序列化,序列化程序需要能够实例化一个具体类型,并且它通过反映要反序列化的类的字段/属性来确定该类型

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

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


(后记:事实上,我撒了一点谎,
BinaryFormatter
可以直接对接口类型进行序列化/反序列化,但我强烈怀疑这不是这里使用的内容。)

您使用的序列化程序是什么?
BinaryFormatter
XmlSerializer
DataContractSerializer
?“鲍勃的土生土长的有机连载器"?另外-是否涉及任何
事件
s?请参见我的编辑;是的,在调用binaryFormatter的过程中涉及到一些事件。反序列化;您是否看到任何连接?接口用于确定类是否表示可以序列化,如果您有一个基于接口的引用列表,则接口e未标记为可序列化,可能序列化代码试图告诉您,此处可能有它无法处理的对象?即使您当前的对象图是A-OK。我看不出这怎么可能是真的,因为接口不能[serializable]。事实上,情况显然不是这样,任何简单的测试都会显示。不,不是这样;我们确实在使用BinaryFormatter;而且它确实可以序列化类,即使它们仅通过接口声明。类的类型仍然是具体类型,正如您所说,它可以进行反射;事实上,它是在clas中声明的仅通过接口的s属性不会改变这一点。我不明白。实现IListMember的类是[Serializable]-为什么我要创建额外的抽象基类?
[Serializable]
public ListMemberBase : IListMember
{
   // Implement abstract versions of everything
}
class TheClassYoureSerializing
{
   [Serializable]
   public List<IListMember> list { get; set; }
}