设计了Java';s可序列化或可克隆是在C#中进化出来的?

设计了Java';s可序列化或可克隆是在C#中进化出来的?,c#,java,serialization,language-design,cloneable,C#,Java,Serialization,Language Design,Cloneable,Java在其标准库中为反序列化/序列化/克隆任务提供了Java.io.Serializable和Java.lang.Cloneable(以及在语言和JVM中对其的特殊支持) C#是否选择了一条不同的路径来提供此功能,使用它的实现和代码与Java有何不同,为什么要这样做 举个例子,为什么C#同时使用属性(注释)和接口进行序列化?如果您想了解有关序列化的内容:不确定您所说的“进化”是什么意思,如果我认为趋势是使用属性而不是标记接口的话。我不知道Java最近是否也走了这条路 例如,CLR中的序列化以其

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

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


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

如果您想了解有关序列化的内容:

不确定您所说的“进化”是什么意思,如果我认为趋势是使用属性而不是标记接口的话。我不知道Java最近是否也走了这条路


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

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

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

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


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

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

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

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

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

  • Cloneable
    完全是破的。它不应该是标记接口,而是指定
    clone()
    方法。既然您有
    Cloneable
    s,您就不能
    clone()


基本上,Java中有很多东西,主要是从1.2之前开始的,都是非常破碎的/混乱的/不干净的/诸如此类的。

C#提供了许多序列化选项——例如
ISerializable
(标记),或
[DataContract]
[Serializable]
(属性),等等。所有情况都要求序列化程序知道如何“读取”此类类/对象,但从根本上说,它没有太大的不同。好的,感谢您的更正。我查看了MSDN文档,没有看到
GetObjectData
是在
ISerializable
上定义的(它在选择.NET 4.0时显示,但在选择.NET 3.5/2.0时不显示)。我假设它的行为仍然可以与Java中的Serializable相媲美,在Java中它没有“正式”定义一个方法,但会寻找一些具有特定名称的方法,并带有一点VM魔力?这样做是为了不要求JVM等价物
GetObjectData
公开。该特定页面上的MSDN文档是错误的。
GetObjectData
方法一直存在。因为它在一个接口上,所以它必须对C#公开,因为这是合同的要点。从.NETFramework1.0开始,这就是ISerializable的目的:实现该方法以控制序列化。这里是另一个正确记录的页面:是的,在Scala中,transient最终是一个注释(就像
@throws
@native
@volatile
,…请参阅)
@serializable
被放弃,取而代之的是
scala.serializable
(扩展
java.io.serializable
,不过…@Soc很想知道。有没有链接到为什么他们决定使用serializable接口而不是注释(我的意思是,创建java字节码需要做更多的工作,但由于他们已经在为字段/方法做类似的事情,这似乎不是大问题)-也许我应该问一个问题..关于何时在类级别使用接口/注释的有趣概念。当然,继续并创建一个问题。这将是一个很好的问题。好吧,这与java兼容性有关…编辑:找到了!兼容性仍然存在。在我看来,我假设scala创建了java代码并替换了它将注释与基本java类型/接口一起提交给编译器之前,在这种情况下,这不会是一个问题-看起来不是这样实现的;)关于接口与注释,thread提出了一些观点,尽管我认为它有点过于具体于实现,并且没有mindYes中的开放性,这基本上就是它们所做的。但是,假设注释不能更改类型层次结构,那么在查看注释之前,似乎对类型进行了处理。但确实如此这里的情况是这样的。修复它需要更深入地混合注释处理和类型处理代码,但被拒绝了,因为这会使编译器代码相当复杂。