为什么Java有transient关键字

为什么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被标记成了transient,所以所以只有原理啊的的图片对象iamge被序列化了,而不是持久化原来的图片和脱略图。这意味着更少的空间将被需要来存储序列化过的对象。(当然,根据系统要求你可以自行决定使用与否----这只是个例子。)

反序列化的时候,readObject方法被调用来执行一些必要操作恢复到序列化发生之前的对象的状态。在这里,readObject方法被重写,这样缩略图将通过调用generateThumbnail方法生成。

有关其他信息,请参阅“ Discover the secrets of the Java Serialization API”一文(最初在Sun Developer Network上提供),其中有一节讨论了如何使用transient关键字来防止某些字段序列化的场景。

三、总结

  1. 为什么要使用transient,减少不必要存储空间的消耗,节省存储空间

  2. 什么时候应该使用transient,当前字段值是由其他字段属性推导可得出,其他更多根据系统需要。

posted @ 2019-06-22 09:12  車轱辘  阅读(338)  评论(0编辑  收藏  举报