可序列化和瞬态

时间:2009-12-17 16:21:56

标签: java serializable

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

class A implements Serializable {
    transient Object a;
}

而不是这个:

serializable class A {
   transient Object a;
}

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

5 个答案:

答案 0 :(得分:27)

  

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

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

另请参阅this reply to a similar question on SOthis one about designing marker interfaces

更新

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

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

答案 4 :(得分:0)

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

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