为什么接口不是[Serializable]?

时间:2010-04-14 16:59:03

标签: c# .net serialization interface

我认为将该属性添加到接口将有助于确保您不创建使用该接口的类并忘记使它们可序列化。

这可能是一个非常基本的问题,但我想问专家。

4 个答案:

答案 0 :(得分:71)

接口定义合约,并且没有自己的任何状态。

序列化是关于将状态保存到对象模型中和从对象模型中加载

没有多大意义来序列化没有状态的东西。


回答强制实现接口为Serializable的实际问​​题 - 这就是ISerializable接口存在的原因。

在.NET中,您可以声明一个应该实现其他接口的接口:

interface MustBeSerializable : ISerializable {}

查看更多信息here

答案 1 :(得分:4)

如果要强制实现自定义接口IMyInterface的类可序列化,则可以定义它:

interface IMyInterface : ISerializable
{
    // Custom interface definition
}

这更清楚地表明实现类应该支持序列化。这不会消除使用[Serializable]属性标记类的需要。

IIRC,您还可以创建一个FxCop自定义规则,检查从IMyInterface继承的类是否使用相应的[Serializable]属性进行标记,这样就不再需要类实现自定义序列化。

答案 2 :(得分:2)

虽然界面背后有一些很好的神秘原因,但并不能保证这一点。但是说:我同意你的看法。如果我们可以将它们合并到接口中,那么有很多东西会很有用。我会想到[Serializable]和静电。

虽然它们不符合接口的概念,但它们似乎在单继承OOP中包含了这个空白的灰色区域。当然有工作,但与最初的意图相比,他们感到非常强迫。

答案 3 :(得分:2)

嗯,默认情况下,新类没有标记为可序列化是有原因的:通过添加Serializable属性,您确认已确保类中的序列化,通过为实例字段选择适当的数据类型,并在必要时添加序列化逻辑。

因此,如果您“忘记”将Serializable属性添加到您的班级,您很可能也忘记检查序列化是否真的适用于您的班级。当然,在许多情况下它会“开箱即用”,所以添加属性就是剩下的,但你应该仔细检查并明确承认这一事实(通过手动添加属性)。