转载

为什么 Java 中要有 transient 字段?

点击上方 蓝色字体 ,选择“设置星标”

优质文章,第一时间送达

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 不序列化某些字段。

原文  http://mp.weixin.qq.com/s?__biz=MzIyNzc1ODQ0MQ==&mid=2247484213&idx=2&sn=9851c9642ffa18064c8d242041ad701a
正文到此结束
Loading...