接口“未标记可序列化属性”异常

时间:2010-04-22 22:06:26

标签: c# exception serialization interface

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

现在,接口不能序列化;实际包含在列表中的类,实现IListMember, [Serializable];是的,我已经检查过IListMember实际上被定义为一个接口而不是偶然的类!

我尝试在一个单独的测试项目中重现异常,该测试项目只包含包含List和成员的类,但在那里它很好地序列化和反序列化:/

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

修改

我们正在使用BinarySerializer;我再说一遍,当提取到一个测试项目时,这个类很快就会序列化。所以我不需要一个变通方法来序列化包含List<IThing>的类,因为通常这样可以正常工作(只要实现IThing的实际类是可序列化的);我正在寻找的是为什么它可能在这个特定的时间工作......

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

2 个答案:

答案 0 :(得分:2)

支持接口的类是可序列化的并不重要。接口无法序列化,期间。

为了反序列化,序列化程序需要能够实例化具体类型,并通过反映要反序列化的类的字段/属性来确定此类型。 / p>

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

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

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

答案 1 :(得分:-1)

简单的方法(虽然丑陋)包裹你的清单:

public ListMemberCollection : List<IListMember>, ISerializable
{
    // Implement ISerializable Here
}

替代方式(虽然更好)AbstractBaseClass:

[Serializable]
public ListMemberBase : IListMember
{
   // Implement abstract versions of everything
}

可能性?:(在你的另一课上)

class TheClassYoureSerializing
{
   [Serializable]
   public List<IListMember> list { get; set; }
}