Java的Serializable或Cloneable等标记接口的设计是否已在C#中进化?

Java在其标准库中提供了java.io.Serializablejava.lang.Cloneable (以及对语言和JVM的特殊支持),用于反序列化/序列化/克隆的任务。

C#选择了不同的路径来提供这种function,使用它的实现和代码与Java有何不同,为什么这样做?

例如,为什么C#同时使用属性(注释)和接口进行序列化?

.NET不使用ISerializable作为标记接口。 它不仅可以作为标记,还可以通过实现GetObjectData和采用合适参数的构造函数来准确控制.NET如何序列化类。

在可以序列化类时使用该属性,但您不希望定义自己的序列化行为。

因此:当您想要定义自己的序列化行为时,请使用ISerializable ; 或者,如果要将其保留到序列化格式化程序,请使用[Serializable]属性。

我会称它为进化吗? 我不知道。 .NET只是为您提供不同程度的灵活性。

如果你想要序列化的话: 检查一下

我不认为C#已经发展了。 相反,他们修复了两件事:

  • Java中的序列化不是很简洁:反序列化涉及对象“创建”而不调用构造函数,整个过程可以包括运行时调用私有方法等。如果您好奇,请检查规范 。

  • Cloneable只是简单的破碎。 它不应该是标记接口,而是指定clone()方法。 因为你有Cloneable s你不能clone()

基本上,Java中有很多东西,主要来自前1.2天,完全破碎/混乱/不洁/无论如何。

不确定’evolved’是什么意思,如果有什么我认为趋势是属性而不是标记接口。 我不知道Java最近是否也这样。

例如,CLR中的序列化以其最基本的forms与属性进行了certificate,尽管您可以实现一些非标记接口,以便在需要时更好地控制过程。

标记接口可能是Java中实现的最糟糕的决策之一。 我的意思是看看Cloneable是多么无用,因为没有人在接口中定义了一个公共clone()方法。

.NET没有进入那个方向(至少我不知道那个方向上的任何接口)不是一个进化而是更多的放弃整个概念。 似乎越来越多的另一个方向似乎是注释,我认为你可以看作是一个“标记”,但是在一个更基础的层面上(例如,我很确定Java是否在今天实现瞬态将是一个注释,不是资格者)