为什么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来表示他们不是持久状态的一部分.
二、举例
举个例子,你有字段是来源于其他字段推导出来的 ,并且只能以编码方式实现,而不是通过序列化保持这个状态。
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
在反序列化的时候,readObject方法被调用来执行一些必要操作恢复到序列化发生之前的对象的状态。在这里,readObject方法被重写,这样缩略图将通过调用generateThumbnail方法生成。
有关其他信息,请参阅“ Discover the secrets of the Java Serialization API”一文(最初在Sun Developer Network上提供),其中有一节讨论了如何使用transient关键字来防止某些字段序列化的场景。
三、总结
-
为什么要使用transient,减少不必要存储空间的消耗,节省存储空间。
-
什么时候应该使用transient,当前字段值是由其他字段属性推导