我们都知道,阳光是看得见却摸不着的。它真实的存在,但是却无法将其装在罐子里,这是因为光子不具有静止质量。这注定我们只能利用光子而不能将其捕获(或许只是暂时)。在Java中,有一种变量就像光子一样,我们可以利用它完成业务逻辑,但是却无法将其序列化保存在磁盘中(就像光子无法放在罐子里)。这种被transient关键字修饰的变量我们称之为瞬态变量。

一、Transient的作用:

  在Java中,只要一个对象实现了Serilizable接口,该类的所有属性和方法都将会自动序列化,使用起来非常方便。
但是有时我们在使用序列化的时候,只需要类中的一部分序列化,而另一部分则不序列化,比如用户的银行卡信息等,这些信息我们不希望在网络操作中被传输,为了安全起见,我们就可以给它们加上transient关键字,成为瞬态变量。这样一来,这些字段的生命周期就只存在于调用者的内存中,而不会在磁盘中持久化

class User implements Serializable {
    private static final long serialVersionUID = 8294180014912103005L;  
    
    private String username;
    private transient String passwd;//瞬态变量,序列化的时候会被忽略掉
    
    public String getUsername() {return username; }
    public void setUsername(String username) {this.username = username;} 
    public String getPasswd() {return passwd; } 
    public void setPasswd(String passwd) {this.passwd = passwd; }
}

二、Transient使用总结

变量被transient修饰则不再是对象持久化的一部分,该变量内容在序列化之后将无法访问(获得)。
Transient只能修饰变量,不能修饰方法和类。本地变量不能被transient来修饰,自定义类需要实现Serializable接口(不能是Externalizable接口)。
被transient修饰的变量将不能序列化,被static关键字修饰的静态变量无论是否有transient,都不能被序列化(即静态变量不能序列化)。
Transient并不是一种很好的局部序列化的方式,因为在使用它之后,被transient修饰的变量返回的都是默认值,这很容易在程序中引发我们意想不到的结果(比如等值判断或是数据库写入操作等),因此并不推荐使用transient瞬态变量。

三、注意

  虽然transient关键字用于声明瞬态变量,在序列化的时候不会被持久化到磁盘。但是能不能序列化被transient关键字修饰的变量,这是根据类实现的序列化接口决定的。例如:Serializable接口中,若没有强制指定序列化属性,则transient有效;若Serializable接口中指定了强制序列化的属性,则transient无效;而Externalizable接口本身就需要指定序列化的属性,所以transient在该接口中无效