10

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

class A implements Serializable {
    transient Object a;
}

而不是这个:

serializable class A {
   transient Object a;
}

为什么,如果我们想让一个类可序列化,我们要实现一个特殊的接口。如果我们想排除一些字段,我们使用关键字 transient? 为什么在这两种情况下都不使用特殊关键字?我的意思是有任何理由以不同的方式制作相同的东西吗?我知道,没有这样的关键字,serializable但为什么不引入它而不是特殊接口Serializable

4

5 回答 5

28

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

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

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

如今,在这两种情况下,人们都会为此目的使用注释(以及其他诸如模糊strictfp关键字之类的东西)。

于 2009-12-17T16:33:41.750 回答
4

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

于 2009-12-17T16:29:42.377 回答
1

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

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

另请参阅对 SO 上类似问题的回复以及关于设计标记接口的此回复。

更新

为什么要为可序列化、可克隆等标记接口而没有关键字?我的猜测是,如果行为方面将其纳入语言,则有可能使用新的标记接口和太多的关键字来一致地扩展 Java 运行时库。

类属性不能实现接口并且transient可以被视为属性的通用属性这一事实transient作为语言关键字引入是有意义的。

于 2009-12-17T16:35:07.677 回答
0

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

于 2009-12-17T16:32:11.193 回答
0

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

通过这个来清楚地理解序列化和瞬态关键字。 http://www.codingeek.com/java/io/object-streams-serialization-deserialization-java-example-serializable-interface/

于 2014-12-10T08:09:39.447 回答