具有像Java';s在C#中进化而来的可串行化或可克隆化

本文关键字:进化 Java | 更新日期: 2023-09-27 17:58:52

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

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

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

具有像Java';s在C#中进化而来的可串行化或可克隆化

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

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

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

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

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

我不认为C#已经进化了。相反,他们解决了两个问题:

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

  • Cloneable完全坏了。它不应该是一个标记接口,而是指定clone()方法。因为你有Cloneable,所以你不能clone()

基本上,Java中有很多东西,主要是在1.2之前的日子里,都很破碎/一团糟/不干净/什么的。

不确定"进化"是什么意思,如果有什么不同的话,我认为趋势是向属性而不是标记接口发展。我不知道Java最近是否也有这样的发展。

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

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

.NET没有朝那个方向发展(至少我不知道有哪个接口朝那个方向)与其说是一种进化,不如说是对整个概念的放弃。另一个似乎越来越多的方向似乎是注释,我想你可以把它看作是一个"标记",但在更基本的层面上(例如,我很确定如果Java今天实现了,transient将是一个注释,而不是限定符)