被遺忘的Java關(guān)鍵字transient的使用詳解
前言
今天在看項(xiàng)目代碼時(shí)候,看到了下面這樣一行代碼,用transient修飾了一個(gè)變量,主要作用是做一個(gè)全局開(kāi)關(guān)。說(shuō)實(shí)話(huà)我是第一次看到這個(gè)關(guān)鍵字。激發(fā)了我的好奇心,所以就了解一下這是何方神圣。
/**
* 全局開(kāi)關(guān)
*/
public static transient boolean running = true;transient 是什么
在 Java 中,transient 是一個(gè)關(guān)鍵字,用于指定一個(gè)類(lèi)的字段(成員變量)在序列化時(shí)應(yīng)該被忽略。在 Java 對(duì)象序列化期間,對(duì)象的狀態(tài)被轉(zhuǎn)換為字節(jié)流,以便在網(wǎng)絡(luò)上傳輸或持久保存到磁盤(pán)。如果一個(gè)字段被標(biāo)記為 transient,那么它的值不會(huì)被序列化,在反序列化時(shí)會(huì)被恢復(fù)其默認(rèn)值。
簡(jiǎn)單示例
public class Example implements Serializable {
private String name;
private transient int age;
public Example(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return "Example{name='" + name + "', age=" + age + "}";
}
public static void main(String[] args) throws Exception {
String dir = "/Users/ryan/Desktop/";
// 創(chuàng)建一個(gè)Example對(duì)象并序列化到文件
Example obj = new Example("Ryan", 20);
System.out.println("Before serialization: " + obj);
OutputStream outputStream = Files.newOutputStream(Paths.get(dir + "example.ser"));
try (ObjectOutputStream out = new ObjectOutputStream(outputStream)) {
out.writeObject(obj);
}
// 從文件中反序列化Example對(duì)象
InputStream inputStream = Files.newInputStream(Paths.get(dir + "example.ser"));
try (ObjectInputStream in = new ObjectInputStream(inputStream)) {
System.out.println("After deserialization: " + in.readObject());
}
}
}執(zhí)行結(jié)果:
Before serialization: Example{name='Ryan', age=20}
After deserialization: Example{name='Ryan', age=0}
在上述示例中,我們創(chuàng)建了一個(gè)名為 Example 的類(lèi),并在其中定義了兩個(gè)字段 name 和 age,其中 age 被標(biāo)記為 transient。然后,我們創(chuàng)建了一個(gè) Example 對(duì)象并將其序列化到名為 example.ser 的文件中。
接著,我們從文件中反序列化了剛剛序列化的 Example 對(duì)象,并將其賦值給一個(gè)新的對(duì)象 newObj。然后,我們打印出了原始對(duì)象和反序列化后的對(duì)象??梢钥吹剑诜葱蛄谢?,age 字段的值被恢復(fù)為其默認(rèn)值 0。
使用場(chǎng)景
序列化敏感數(shù)據(jù)
有些對(duì)象包含一些敏感信息,如密碼、訪問(wèn)令牌等,這些信息在對(duì)象序列化時(shí)需要被保護(hù),以防被未授權(quán)的用戶(hù)訪問(wèn)和泄露。
提高序列化性能
有些對(duì)象中的字段可能會(huì)影響序列化和反序列化的性能,如包含大量數(shù)據(jù)的對(duì)象,這些數(shù)據(jù)可能會(huì)在網(wǎng)絡(luò)傳輸或磁盤(pán)存儲(chǔ)期間增加延遲和負(fù)載,使用 transient 關(guān)鍵字可以排除這些字段,提高序列化性能。
臨時(shí)數(shù)據(jù)
有些字段僅用于對(duì)象的內(nèi)部計(jì)算或臨時(shí)存儲(chǔ)數(shù)據(jù),這些數(shù)據(jù)在序列化時(shí)無(wú)需保留,因此可以使用 transient 關(guān)鍵字來(lái)忽略這些字段,從而減少序列化后對(duì)象的大小。
需要注意的點(diǎn)
- transient關(guān)鍵字只能修飾變量,而不能修飾方法和類(lèi)。
- transient標(biāo)記的變量所在的類(lèi)必須實(shí)現(xiàn)Serializable接口。
- transient標(biāo)記的變量在反序列化時(shí)會(huì)被初始化為默認(rèn)值,需要在程序中手動(dòng)進(jìn)行初始化操作。
總結(jié)
transient 關(guān)鍵字只是暫時(shí)地在序列化過(guò)程中忽略了該字段,而不是永久性地從對(duì)象中刪除該字段。在反序列化時(shí),該字段將被恢復(fù)為其默認(rèn)值。因此,如果需要永久地從對(duì)象中刪除一個(gè)字段,直接將其從類(lèi)中完全刪除。
應(yīng)該很少有人,會(huì)在項(xiàng)目中使用這個(gè)關(guān)鍵字吧,所以它值得被遺忘
到此這篇關(guān)于被遺忘的Java關(guān)鍵字transient的使用詳解的文章就介紹到這了,更多相關(guān)Java關(guān)鍵字transient內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中關(guān)于優(yōu)先隊(duì)列PriorityQueue的使用及相關(guān)方法
這篇文章主要介紹了Java中關(guān)于優(yōu)先隊(duì)列PriorityQueue的使用及相關(guān)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
通過(guò)Java實(shí)現(xiàn)添加或刪除PDF中的附件
當(dāng)我們?cè)谥谱鱌DF文件或者PPT演示文稿的時(shí)候,為了讓自己的文件更全面詳細(xì),就會(huì)在文件中添加附件。本文為大家整理了Java實(shí)現(xiàn)添加或刪除PDF中的附件的方法,需要的可以參考下2023-01-01
Dwr3.0純注解(純Java Code配置)配置與應(yīng)用淺析一之零配置文件化
Dwr對(duì)我來(lái)說(shuō)最重要的功能點(diǎn)就是反向Ajax調(diào)用,通俗來(lái)將就是后端可以直接調(diào)用前端的JS方法(只要在所能訪問(wèn)的范圍內(nèi)),這也就是Dwr的真正來(lái)由,當(dāng)然它也有最基本的前端直接調(diào)用后端的特性,省去了我們經(jīng)常的一般Ajax調(diào)用2016-04-04
MyBatis saveBatch 性能調(diào)優(yōu)的實(shí)現(xiàn)
本文主要介紹了MyBatis saveBatch 性能調(diào)優(yōu)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Dwr3.0純注解(純Java Code配置)配置與應(yīng)用淺析二之前端調(diào)用后端
我們講到了后端純Java Code的Dwr3配置,完全去掉了dwr.xml配置文件,但是對(duì)于使用注解的類(lèi)卻沒(méi)有使用包掃描,而是在Servlet初始化參數(shù)的classes里面加入了我們的Service組件的聲明暴露,對(duì)于這個(gè)問(wèn)題需要后面我們?cè)偌?xì)細(xì)研究下這篇文章,主要分析介紹前端怎么直接調(diào)用后端2016-04-04
java map中相同的key保存多個(gè)value值方式
這篇文章主要介紹了java map中相同的key保存多個(gè)value值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
java簡(jiǎn)單實(shí)現(xiàn)八叉樹(shù)圖像處理代碼示例
這篇文章主要介紹了java簡(jiǎn)單實(shí)現(xiàn)八叉樹(shù)圖像處理代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12

