Java transient關鍵字學習
阿新 • • 發佈:2019-01-02
transient關鍵字,我們在使用Hibernate中,可以用@Transient註解某個欄位不需要持久化,那麼java中這個關鍵字是怎麼樣呢?
總結:當一個物件實現了Serilizable介面,那麼大家都知道,這個物件可以被序列化,但是當你存在某些需求,比如你需要這個物件的某一個或者某幾個屬性不想被序列化的時候,可以對屬性進行transient關鍵字宣告
程式碼部分:
package org.test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* @version 1.0
* @author NICK
*/
public class TransientTest {
public static void main(String[] args) throws Exception {
People people = new People();
people.setUserName("Nickwu");
people.setPassword("password" );
System.out.println("people --> username: " + people.getUserName());
System.out.println("people --> password: " + people.getPassword());
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("people.txt"));
oos.writeObject(people);
oos.flush();
oos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("people.txt"));
People p = (People) ois.readObject();
ois.close();
System.out.println("p-->username: " + p.getUserName());
System.out.println("p-->password: " + p.getPassword());
}
}
class People implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private String userName;
private transient String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
使用場景:
如果一個使用者有一些敏感資訊(如密碼,銀行卡號等),為了安全起見,不希望在網路操作(主要涉及到序列化操作,本地序列化快取也適用)中被傳輸,這些資訊對應的變數就可以加上transient關鍵字。換句話說,這個欄位的生命週期僅存於呼叫者的記憶體中而不會寫到磁盤裡持久化。
使用總結:
1)一旦變數被transient修飾,變數將不再是物件持久化的一部分,該變數內容在序列化後無法獲得訪問。
2)transient關鍵字只能修飾變數,而不能修飾方法和類。注意,本地變數是不能被transient關鍵字修飾的。變數如果是使用者自定義類變數,則該類需要實現Serializable介面。
3)被transient關鍵字修飾的變數不再能被序列化,一個靜態變數不管是否被transient修飾,均不能被序列化。
4)只有當實現了Serilizable介面的時候,transient才能生效,java中實現了Externalizable也可以序列化,但是實現了Externalizable介面,需要writeExternal才能寫入序列化,這個時候即使聲明瞭transient,只要呼叫了writeExternal也可以被序列化