可序列化和瞬态

要使类可序列化,我们执行以下操作:

class A implements Serializable { transient Object a; } 

而不是这个:

 serializable class A { transient Object a; } 

为什么,如果我们想使类可序列化,我们是否实现了一个特殊的接口 。 如果我们想要排除某些字段,我们会使用关键字 transient ? 为什么两种情况下都没有使用特殊关键字? 我的意思是有什么理由以不同的方式做同样的事情吗? 我知道,没有像serializable这样的关键字但为什么不引入而不是特殊的接口Serializable

为什么没有使用一些特殊的关键字将类标记为可序列化? Serializable接口在代码中看起来像一个神奇的数字,而不像语言function。

我认为你必须以另一种方式来看待它:语言关键字的存在主要是为了支持编译时语言结构。 序列化是一种运行时机制。 此外,您不希望为所有内容添加额外的关键字,因为您无法将其用作标识符。 另一方面,标记界面的侵入性要小得多。

问题是:为什么我们需要一个语言关键字来标记瞬态字段? 答案是,当时没有其他方法可以标记特定字段。

如今,在这两种情况下都会为此目的使用注释(以及其他类似于obscure strictfp关键字的东西)。

Serializable是一个标记界面。 接口是指示类的特征的标准方式(在Java和一些其他语言中); “是一种”关系。 使Serializable成为一个接口意味着我们可以声明接受或返回Serializable的方法就像我们可以使用其他接口的方法一样。 任何其他东西都需要语言的语法更改(当时;现在我们有注释,但我认为仍然会使用一个接口)。

所以你问为什么你不能将类标记为不可序列化(如瞬态成员)? 为什么不将不可序列化类型的类成员标记为瞬态? 或者在进行序列化时使用该类类型的序列化委托? 你想要告诉Java不要在这个级别做某事而不是告诉它做某事似乎有点奇怪。

Serializable是一个标记接口(如Cloneable ),用于为标准Java运行时库代码设置一个标志,可以根据该类的设计者对对象进行序列化。

transient关键字可用于指定不需要序列化属性,例如因为它是派生属性。

另见关于SO的类似问题的回复,以及关于设计标记接口的问题 。

更新

为什么标记接口,没有可序列化,可复制等的关键字? 我的猜测是,如果行为方面将语言纳入语言,则可以使用新的标记接口和过多的关键字一致地扩展Java运行时库。

类属性无法实现接口和transient的事实可以被视为属性的通用属性,这有助于将transient作为语言关键字引入。

瞬态关键字用于保护变量或字段不被存储,我们这样做是为了保护我们不想在每个地方分发的一些敏感信息,我们使用Serializable接口来创建Serializable类。 虽然我们也可以使用Externalizable接口,但我们更喜欢使用Serializable,因为它有一些优点。

尽管如此,要清楚地了解序列化和瞬态关键字。 http://www.codingeek.com/java/io/object-streams-serialization-deserialization-java-example-serializable-interface/