为什么Java有transient字段?
Java中的transient关键字用于指示字段不应该是序列化(这意味着像文件一样保存)过程的一部分。
transient
来自Java 语言规范,Java SE 7 版,第 8.3.1.3 节。transient领域:
可以标记变量transient以指示它们不是对象的持久状态的一部分。
例如,您可能有从其他字段派生的字段,并且只能以编程方式完成,而不是通过序列化来保持状态。
这是一个GalleryImage包含图像和从图像派生的缩略图的类:
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
generateThumbnail
该thumbnailImage字段标记为transient,因此仅对image原始图像进行序列化,而不是同时保留原始图像和缩略图图像。这意味着保存序列化对象所需的存储空间更少。(当然,根据系统的要求,这可能是可取的,也可能不是可取的——这只是一个例子。)
image
在反序列化时,readObject调用该方法以执行将对象状态恢复到发生序列化时的状态所需的任何操作。这里需要生成缩略图,所以readObject重写了方法,调用generateThumbnail方法生成缩略图。
readObject