点击上方 蓝色字体 ,选择“设置星标”
优质文章,第一时间送达
Java 中的 transient 关键字用来表明部分属性不能被序列化(类似于保存一个文件)。
Java Language Specification, Java SE 7 Edition
,
Section 8.3.1.3. transient
Fields
: 中解释到
Variables may be marked transient to indicate that they are not part of the persistent state of an object.
大意是:一个对象中被 transient 声明的变量是不会被持久化的。
例如:你有一些字段是通过其他字段派生而来,直接运行程序执行它,并不需要通过序列化的方式保持其状态。
这里有一个 GalleryImage 类,它包含一张图片和一个缩略图,其中缩略图是派生自图片。
class GalleryImage implements Serializable
{
private Image image;
private transient Image thumbnailImage;
private void generateThumbnail()
{
// Generate thumbnail.
}
private void readObject(ObjectInputStream inputStream)
throws IOException, ClassNotFoundException
{
inputStream.defaultReadObject();
generateThumbnail();
}
}
在这个例子中,thumbnailImage 是一张缩略图,他通过调用 generateThumbnail 方法生成。
这个 thumbnailImage 字段被 transient 声明,所以只有原始字段 image 会被序列化而不是它们两个都可以被序列号。这意味着只需要很少的空间来保存序列化的对象。(当然是否序列化某个字段是依赖系统的设计,毕竟我这只是一个例子)
在反序列化的时候,使用 readObject 方法把对象回复到序列化之前的状态,但是因为没有序列化 thumbnailImage 字段,所以我们需要重写 readObject 方法以便在反序列化的时候可以通过 generateThumbnail 方法生成 thumbnailImage 属性。
另外, 这篇文章: Discover the secrets of the Java Serialization API 点击原文查看,通过具体的使用场景来讨论 transient 不序列化某些字段。