java(十四):transient與序列化

transient譯作臨時的,瞬態的意思,指的是在序列化的時候,被該關鍵字修飾的變量將不會被持久化。
比如用戶的密碼,身份證號,當希望將其保存到文件而又過濾掉這些敏感信息時,就可以使用該關鍵字修飾。
說道序列化,需要說明的是,static關鍵字不會被被序列化也不會被反序列化,因爲static是類成員,在反序列化時(其實等同於初始化),就會使用類裏的初始值,然而需要注意的是,內存中如果已經存在該類,且該類的該靜態變量已經賦予了新值,則被序列化的類就會使用新的值。
下面的參考例子出自Java transient關鍵字使用小記

public class Test01{
    public static void main(String[] args){
        User user = new User();
        user.setUsername("Alexia");
        user.setPasswd("123456");

        System.out.println("read before Serializable: ");
        System.out.println("username: " + user.getUsername());
        System.err.println("password: " + user.getPasswd());

        try {
            ObjectOutputStream os = new ObjectOutputStream(
                    new FileOutputStream("C:\\Users\\xxx\\Desktop/user.txt"));
            os.writeObject(user); // 將User對象寫進文件
            os.flush();
            os.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            // 在反序列化之前改變username的值
            //User.username = "jiang";

            ObjectInputStream is = new ObjectInputStream(new FileInputStream(
                    "C:\\Users\\xxx\\Desktop/user.txt"));
            user = (User) is.readObject(); // 從流中讀取User的數據
            is.close();

            System.out.println("\nread after Serializable: ");
            System.out.println("username: " + user.getUsername());
            System.err.println("password: " + user.getPasswd());

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

}

class User implements Serializable {
    private static final long serialVersionUID = 8294180014912103005L;
    public static 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;}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章