Java在他的标准库(以及语言和 JVM 中对它的特殊支持)中为反序列化/序列化/克隆的任务提供了和java.io.Serializable
。java.lang.Cloneable
C# 是否选择了不同的路径来提供此功能,使用它的实现和代码与 Java 有何不同,为什么要这样做?
例如,为什么 C# 同时使用属性(注解)和接口进行序列化?
Java在他的标准库(以及语言和 JVM 中对它的特殊支持)中为反序列化/序列化/克隆的任务提供了和java.io.Serializable
。java.lang.Cloneable
C# 是否选择了不同的路径来提供此功能,使用它的实现和代码与 Java 有何不同,为什么要这样做?
例如,为什么 C# 同时使用属性(注解)和接口进行序列化?
.NET 不仅仅ISerializable
用作标记接口。它不仅充当标记,还允许您通过实现GetObjectData
和采用合适参数的构造函数来精确控制 .NET 如何序列化类。
当类可以序列化时使用该属性,但您不想定义自己的序列化行为。
所以:ISerializable
当你想定义自己的序列化行为时使用;或者[Serializable]
当您想将其留给序列化格式化程序时使用该属性。
我可以称之为进化吗?我不知道。.NET 只是为您提供不同程度的灵活性。
如果你想要一些关于序列化的东西:检查这个
我不认为 C# 已经进化了。相反,他们解决了这两件事:
Java中的序列化不是很干净:反序列化涉及对象“创建”而不调用构造函数,整个过程可以包括运行时调用私有方法等。如果你好奇,请查看规范。
Cloneable
只是简单的破碎。它不应该是标记接口,而是指定clone()
方法。因为它是你有Cloneable
你不能clone()
。
基本上,Java 中有很多东西,主要是从 1.2 之前的版本开始,这些东西非常破碎/混乱/不干净/无论如何。
不确定您所说的“进化”是什么意思,如果有的话,我认为趋势是朝向属性而不是标记界面。我不知道 Java 最近是否也这样。
例如,CLR 中的序列化以其最基本的属性形式得到证明,尽管您可以实现一些非标记接口,以便在需要时对流程进行更多控制。
标记接口可能是用 Java 实现的最糟糕的决定之一。我的意思是看看 Cloneable 原来是多么无用,因为没有人在接口中定义公共 clone() 方法。
.NET 不朝那个方向发展(至少我不知道该方向的任何接口)与其说是进化,不如说是对整个概念的放弃。似乎越来越多的另一个方向似乎是注释,我假设您可以将其视为“标记”,但在更基本的层面上(例如,我很确定今天是否实现了 Java,transient 将是一个注释和不是限定词)