要使类可序列化,我们执行以下操作:
class A implements Serializable {
transient Object a;
}
而不是这个:
serializable class A {
transient Object a;
}
为什么,如果我们想要使类可序列化,我们是否实现了特殊接口。如果我们想要排除某些字段,请使用关键字 transient
?
为什么两种情况下都没有使用特殊关键字?我的意思是有什么理由以不同的方式做同样的事情吗?我知道,没有像serializable
这样的关键字,但为什么不引入它而不是特殊界面Serializable
?
答案 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 SO和this 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/