java 的transient關(guān)鍵字的作用是需要實現(xiàn)Serilizable接口,將不需要序列化的屬性前添加關(guān)鍵字transient,序列化對象的時候,這個屬性就不會序列化到指定的目的地中。
用法
@transient 就是在給某個javabean上需要添加個屬性,但是這個屬性你又不希望給存到數(shù)據(jù)庫中去,僅僅是做個臨時變量,用一下。不修改已經(jīng)存在數(shù)據(jù)庫的數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。
那么這個注解就可以一用。
只要在你準備添加的臨時屬性上添加這個注解,然后getter和setter自動完成一下,就可以啦。
@Document(collection = "streams")
public class Stream implements Serializable,Cloneable {
? ? private static final long serialVersionUID = 1L;
? ? @Transient
? ? private boolean alarmsettingsActive = false;
xxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxx
}
上面的是個人理解,下面呢就是詳細說說。
transient的作用
我們都知道一個對象只要實現(xiàn)了Serilizable接口,這個對象就可以被序列化,java的這種序列化模式為開發(fā)者提供了很多便利,我們可以不必關(guān)系具體序列化的過程,只要這個類實現(xiàn)了Serilizable接口,這個類的所有屬性和方法都會自動序列化。
然而在實際開發(fā)過程中,我們常常會遇到這樣的問題,這個類的有些屬性需要序列化,而其他屬性不需要被序列化,打個比方,如果一個用戶有一些敏感信息(如密碼,銀行卡號等),為了安全起見,不希望在網(wǎng)絡(luò)操作(主要涉及到序列化操作,本地序列化緩存也適用)中被傳輸,這些信息對應(yīng)的變量就可以加上transient關(guān)鍵字。換句話說,這個字段的生命周期僅存于調(diào)用者的內(nèi)存中而不會寫到磁盤里持久化。
總之,java 的transient關(guān)鍵字為我們提供了便利,你只需要實現(xiàn)Serilizable接口,將不需要序列化的屬性前添加關(guān)鍵字transient,序列化對象的時候,這個屬性就不會序列化到指定的目的地中。
transient使用小結(jié)
1)一旦變量被transient修飾,變量將不再是對象持久化的一部分,該變量內(nèi)容在序列化后無法獲得訪問。
2)transient關(guān)鍵字只能修飾變量,而不能修飾方法和類。注意,本地變量是不能被transient關(guān)鍵字修飾的。變量如果是用戶自定義類變量,則該類需要實現(xiàn)Serializable接口。
3)被transient關(guān)鍵字修飾的變量不再能被序列化,一個靜態(tài)變量不管是否被transient修飾,均不能被序列化。
編碼試驗加以證明:
1.自定義類(為了方便,我直接在main方法所在類中添加的一個靜態(tài)屬性類,或者叫成員類)
```
public static class TransientTest implements Serializable{
private static final long serialVersionUID = 233858934995755239L;
private String name1;
private transient String name2;
public TransientTest(String name1,String name2){
this.name1 = name1;
this.name2 = name2;
}
public String toString(){
return String.format("TransientTest.toString(): name1=%s,name2=%s", name1,name2);
}
}
```
2.寫一個測試方法
```
public static void testTransient(){
String name1="常規(guī)屬性",name2="transient修飾的屬性";
TransientTest test = new TransientTest(name1, name2);
System.out.println("序列化前:"+test.toString());
ObjectOutputStream outStream;
ObjectInputStream inStream;
String filePath = "D:/test/object/TransientTest.obj";
try {
outStream = new ObjectOutputStream(new FileOutputStream(filePath));
outStream.writeObject(test);
inStream = new ObjectInputStream(new FileInputStream(filePath));
TransientTest readObject = (TransientTest)inStream.readObject();
System.out.println("序列化后:"+readObject.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
```
3.在main方法中執(zhí)行,然后可以看到得到的結(jié)果為

印證了上面所講的“用transient關(guān)鍵字標記的成員變量不參與序列化過程