C# 为什么接口不能[序列化]?

C# 为什么接口不能[序列化]?,c#,.net,serialization,interface,C#,.net,Serialization,Interface,我认为,将该属性添加到接口将有助于确保您不会创建使用该接口的类,而忘记将它们序列化 这可能是一个非常基本的问题,但我想问专家们 接口定义了一个契约,没有自己的任何状态 序列化是关于在对象模型中保存和加载状态 序列化没有状态的东西没有多大意义 回答一个实际问题,即强制接口的实现是可序列化的,这就是接口存在的原因 在.NET中,您可以声明一个应实现其他接口的接口: interface MustBeSerializable : ISerializable {} 查看更多信息。如果要强制实现自定义接

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


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

接口定义了一个契约,没有自己的任何状态

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

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


回答一个实际问题,即强制接口的实现是可序列化的,这就是接口存在的原因

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

interface MustBeSerializable : ISerializable {}

查看更多信息。

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

interface IMyInterface : ISerializable
{
    // Custom interface definition
}
这更清楚地表明实现类应该支持序列化。这并不意味着不需要使用
[Serializable]
属性标记类


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

在接口是什么和不是什么的背后有一些很好但深奥的原因,这些原因阻止了实现自定义序列化。不过,我同意你的看法。如果我们能够将它们合并到接口中,那么有很多东西是有用的<代码>[Serializable]和静态会浮现在脑海中


虽然它们不符合什么是接口的理念,但它们似乎将这个空白的灰色区域合并到了单继承OOP中。当然有一些变通方法,但与最初的意图相比,它们感觉非常强制。

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


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

魔鬼代言人:接口意味着对象如何在其状态下工作。接口没有状态,但它们将用于定义对象,这些对象与状态的访问方式有关。Dinah:Serializable属性与数据有关,而不是行为。如果IList持有列表,这是否意味着变量持有状态?@Aaron-我不知道你的意思。我的意思是,IList List=new List(){..elements..};Xmlserializer仍然不工作,我只是确认IList变量是否仍然不保持任何状态?如果您想知道如何操作,您应该检查这个答案