transient

时间:2021-07-19 08:30:56

“transient”——“瞬态”,先不说这个翻译是否恰当,这个变量关键字一直不曾使用,简单的说就是被瞬态定义的变量不可序列号。或者这么给他换个名字——“不可序列化状态”。
打个比方,如果一个用户有一些敏感信息(譬如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输。这些信息对应的变量就可以被定义为transient类型。换句话说,这个字段的生命周期仅存于调用者的内存中。

如定义类:
    public class People implements Serializable { 
        private static final long serialVersionUID = 8294180014912103005L; 
        /**
         * 用户名
         */ 
        private String username; 
        /**
         * 密码
         */ 
        private transient String password; 
    }

密码字段为transient,这时候如果对该对象进行序列化,这个密码字段是不会被保存的。

以下例子展示了这个行为:
    public static void main(String[] args) throws Exception { 
            People p = new People(); 
            p.setUsername("snowolf"); 
            p.setPassword("123456"); 
     
            System.err.println("------操作前------"); 
            System.err.println("username: " + p.getUsername()); 
            System.err.println("password: " + p.getPassword()); 
     
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream( 
                    "people.txt")); 
            oos.writeObject(p); 
            oos.flush(); 
            oos.close(); 
     
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream( 
                    "people.txt")); 
            p = (People) ois.readObject(); 
     
            ois.close(); 
     
            System.err.println("------操作后------"); 
            System.err.println("username: " + p.getUsername()); 
            System.err.println("password: " + p.getPassword()); 
        }
执行结果是:
    ------操作前------  
    username: snowolf  
    password: 123456  
    ------操作后------  
    username: snowolf  
    password: null