具有像Java';s在C#中进化而来的可串行化或可克隆化
本文关键字:进化 Java | 更新日期: 2023-09-27 17:58:52
Java在其标准库中提供java.io.Serializable
和java.lang.Cloneable
(以及在语言和JVM中对其的特殊支持),用于反序列化/序列化/克隆任务。
C#是否选择了不同的路径来提供此功能,使用它的实现和代码与Java有何不同,为什么要这样做?
举个例子,为什么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将是一个注释,而不是限定符)