transient

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)鍵字標記的成員變量不參與序列化過程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容