java 中 transient 关键字意义

译文出处:Why does Java have transient variables?

java 中的 transient 关键字表明了 transient 变量不应该被序列化(transient)。

参考Java Language Specification, Java SE 7 Edition, Section 8.3.1.3. transient Fields:

被 transient 标记的这些变量,表明他们是某个对象中不需要被持久状态的部分(Variables may be marked transient to indicate that they are
not part of the persistent state of an object.)。

例如,你可能有一些字段是从其他字段导出来的,这些字段的值应该是程序根据一定的算法自动生成的,而不是通过序列化来持久状态(For example, you may have fields that are derived from other fields, and should only be done so programmatically, rather than having the state be persisted via serialization.)。

下面是一个相册 GalleryImage 类,这个相册类包含一张图片和由这张图片导出的一张缩略图。

class GalleryImage implements Serializable
{
    private Image image;
    private transient Image thumbnailImage;

    private void generateThumbnail()
   {
    // Generate thumbnail.
    // 根据 image 原图,由相应的算法来产生缩略图。
   }

   private void readObject(ObjectInputStream inputStream)
        throws IOException, ClassNotFoundException
    {
        inputStream.defaultReadObject();
        generateThumbnail();
    }
}

在上面的例子中, thumbnailImage 是通过调用 generateThumbnail 方法产生的一张缩略图。

thumbnailImage 字段被标记为 transient ,所以只有原始图片 image 字段被序列化了,缩略图 thumbnailImage 不会被序列化。这意味着保存被序列化后的对象时需要更少的存储空间。

在反序列化时,readObject 方法会被调用,为了使对象的状态恢复到被序列化时,readObject 方法会执行所有必要的操作。在这里, thumbnail 缩略图需要被生成,所以 readObject 被重写了,所以 thumbnail 缩略图可以通过调用 generateThumbnail 方法来生成。

想要了解更多的信息,可以参考 Discover the secrets of the Java Serialization API 这篇文章。

时间: 2024-08-02 06:41:45

java 中 transient 关键字意义的相关文章

Java中transient关键字的应用

今天跟JDK源码的时候发现transient ,感觉从来没见过,于是用google查了一下. Java语言的关键字,用来表示一个域不是该对象串行化的一部分.当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的. 下面我们查创建一个LoginFile的类: public class LoginFile implements Serializable{ private static final long serialVersio

Java中的关键字 transient

在讨论transient之前,有必要先搞清楚Java中序列化的含义: Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输,一般当我们使用缓存cache(内存空间不够有可能会本地存储到硬盘)或远程调用rpc(网络传输)的时候,经常需要让我们的实体类实现Serializable接口,目的就是为了让其可序列化. 当然,序列化后的最终目的是为了反序列化,恢复成原先的Java对象,要不然序列化后干

Java中的关键字/保留字

Java关键字是Java语言保留供内部使用的,如class用于定义类. 关键字也可以称为保留字,它们的意思是一样的,我们不能使用关键字作为变量名或方法名. 表2-1 Java中的关键字/保留字 abstract assert boolean break byte case catch char class const continue default do double else extends final finally float for goto if implements import

转:java中volatile关键字的含义

转:java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制. synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用 sync

java中的关键字static(静态变量)和final定义常量

1 package point; 2 3 class Point { 4 5 int x = 0; 6 int y = 0; 7 static int z = 100; // 定义静态变量z,类变量 8 static final double PI = 3.1415926;// final定义常量,它的值在运行时不能被改变 9 10 Point(int a, int b) { 11 //PI=3.1415926; 12 /* 13 * 当使用静态常量的时候,不能在构造函数中初始化, 因为静态时,

Java中this关键字的使用

Java中this关键字的使用主要有两处: 1.构造方法 this指的是调用构造方法进行初始化的对象. //有参构造 public Human(String name, int age) { this(); //调用无参构造 //this(name); //调用有参构造(参数为name的构造方法) this.name = name; this.age= age; } 2.普通方法(非静态方法) this指的是调用该方法的对象. //普通方法 public void setName(String

Java复习笔记--java中this 关键字

Java中this关键字,this可以调用类的成员变量和成员方法,this还可以调用类中的构造方法.使用这种方式值得注意的是, 只可以在无参构造方法中的第一句使用this关键字调用有参构造方法. public class AnyThting{ public AnyThting(){ this("this 调用有参构造方法"); System.out.println("无参构造方法"); } public AnyThting(String name){ System.

java中final的意义

1.如果一个数据既是static又是final,那么它会拥有一块无法改变的存储空间. 2.final data: 当final用于基本数据类型时,final让其值(value)保持不变,但是当用于object reference时,final仅让reference保持不变.也就是说当reference一旦被初始化用于代表某个对象时,便再也不能改变指向另一个对象,但对象本身的内容确实可以改变的.final对array的作用和对reference的作用一样.参考以下例子: public class

java中static关键字总结

Java中,static关键字一般情况下有四种用法: 用来修饰一个变量. 用来修饰一个方法. 用来修饰一个内部类. 用来修饰一段代码块. 1 public class Student{ 2 String name; 3 static int count;//static修饰的变量 4 static{//static修饰的代码块 5 count=0; 6 } 7 public static void playGame(){//static修饰的方法 8 System.out.println("我爱