【问题标题】:Interface "not marked with serializable attribute" exception接口“未标记可序列化属性”异常
【发布时间】:2011-02-11 07:10:24
【问题描述】:

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

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

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

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

编辑:

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

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

【问题讨论】:

  • 您使用的是什么序列化程序? BinaryFormatter? XmlSerializer? DataContractSerializer? “鲍勃的本土有机序列化器”?另外 - 是否有任何 event 参与?
  • 查看我的编辑;是的,在导致调用 binaryFormatter.Deserialize;你看到有什么联系吗?
  • 接口用于确定类是否说它可以序列化,如果你有一个基于接口的引用列表,其中接口没有标记为可序列化,也许序列化代码试图告诉你,你可能在这里有它无法处理的对象?即使您当前的对象图是 A-OK。
  • 我不明白这怎么可能是真的,因为接口不能是 [Serializable]。事实上,事实证明并非如此,任何简单的测试都会显示。

标签: c# exception serialization interface


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 不,不是真的;我们确实在使用 BinaryFormatter;它确实可以序列化类,即使它们仅通过接口声明。类的 type 仍然是具体类型,正如您所说,可以进行反射;仅通过接口在类属性中声明它的事实不会改变这一点。
【解决方案2】:

简单的方法(虽然丑陋)总结你的清单:

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; }
}

【讨论】:

  • 我不明白。实现 IListMember 的类是 [Serializable] - 为什么我要创建一个额外的抽象基类?
猜你喜欢
  • 2015-07-19
  • 2011-02-06
  • 2010-11-22
  • 1970-01-01
  • 2017-02-21
  • 2015-11-10
  • 2016-01-18
相关资源
最近更新 更多