2

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

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

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

4

5 回答 5

3

.NET 不仅仅ISerializable用作标记接口。它不仅充当标记,还允许您通过实现GetObjectData和采用合适参数的构造函数来精确控制 .NET 如何序列化类。

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

所以:ISerializable当你想定义自己的序列化行为时使用;或者[Serializable]当您想将其留给序列化格式化程序时使用该属性。

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

于 2011-06-11T19:36:30.610 回答
2

如果你想要一些关于序列化的东西:检查这个

于 2011-06-11T19:12:55.297 回答
2

我不认为 C# 已经进化了。相反,他们解决了这两件事:

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

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

基本上,Java 中有很多东西,主要是从 1.2 之前的版本开始,这些东西非常破碎/混乱/不干净/无论如何。

于 2011-06-11T23:02:26.933 回答
1

不确定您所说的“进化”是什么意思,如果有的话,我认为趋势是朝向属性而不是标记界面。我不知道 Java 最近是否也这样。

例如,CLR 中的序列化以其最基本的属性形式得到证明,尽管您可以实现一些非标记接口,以便在需要时对流程进行更多控制。

于 2011-06-11T19:16:25.113 回答
1

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

.NET 不朝那个方向发展(至少我不知道该方向的任何接口)与其说是进化,不如说是对整个概念的放弃。似乎越来越多的另一个方向似乎是注释,我假设您可以将其视为“标记”,但在更基本的层面上(例如,我很确定今天是否实现了 Java,transient 将是一个注释和不是限定词)

于 2011-06-11T20:40:52.243 回答