最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java部分序列化之關(guān)鍵字transient使用及說明

 更新時(shí)間:2025年09月30日 09:10:06   作者:pretty_boy1  
Java序列化將對(duì)象轉(zhuǎn)為字節(jié)序列用于存儲(chǔ)或傳輸,需實(shí)現(xiàn)Serializable接口,transient關(guān)鍵字可排除敏感字段或不可序列化對(duì)象,避免反序列化時(shí)恢復(fù)無效數(shù)據(jù)或泄露信息

Java關(guān)鍵字transient使用

JAVA序列化

Java中對(duì)象的序列化指的是將對(duì)象轉(zhuǎn)換成以字節(jié)序列的形式來表示,這些字節(jié)序列包含了對(duì)象的數(shù)據(jù)和信息,一個(gè)序列化后的對(duì)象可以被寫到數(shù)據(jù)庫或文件中,也可用于網(wǎng)絡(luò)傳輸,一般當(dāng)我們使用緩存cache(內(nèi)存空間不夠有可能會(huì)本地存儲(chǔ)到硬盤)或遠(yuǎn)程調(diào)用rpc(網(wǎng)絡(luò)傳輸)的時(shí)候,經(jīng)常需要讓我們的實(shí)體類實(shí)現(xiàn)Serializable接口,目的就是為了讓其可序列化。

當(dāng)然,序列化后的最終目的是為了反序列化,恢復(fù)成原先的Java對(duì)象。所以序列化后的字節(jié)序列都是可以恢復(fù)成Java對(duì)象的,這個(gè)過程就是反序列化。

往往存在這樣的場(chǎng)景,一個(gè)類中有些參數(shù)被序列化毫無意義。序列化只會(huì)增加磁盤或者網(wǎng)絡(luò)傳輸?shù)拇笮?。一個(gè)類中有些敏感信息,比如密碼等。序列化后安全性降低。一個(gè)類中存在某個(gè)對(duì)象無法被序列化。而這個(gè)對(duì)象來自框架或者系統(tǒng)層面。

這個(gè)時(shí)候我們可以使用transient關(guān)鍵字。實(shí)現(xiàn)部分序列化。transient關(guān)鍵字主要作用是:當(dāng)對(duì)象被序列化時(shí)(寫入字節(jié)序列到目標(biāo)文件)時(shí),transient阻止實(shí)例中那些用此關(guān)鍵字聲明的變量持久化;當(dāng)對(duì)象被反序列化時(shí)(從源文件讀取字節(jié)序列進(jìn)行重構(gòu)),這樣的實(shí)例變量值不會(huì)被持久化和恢復(fù)。

示例:

這里有一個(gè)Company類

public class Company implements Serializable{
	private String companyName;
	private String companyAddress;
	private String companyEmail;
	private transient List<Employee> employees;
	
	public Company(String companyName, String companyAddress, String companyEmail, List<Employee> employees) {
		this.companyName = companyName;
		this.companyAddress = companyAddress;
		this.companyEmail = companyEmail;
		this.employees = employees;
	}
}

有一個(gè)Employee類

public class Employee implements Serializable{
	private String Name;
	private String phone;
	public Employee(String name, String phone) {
		Name = name;
		this.phone = phone;
	}
}

測(cè)試方法

public class TestSerializable {

	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
		Employee employee1 = new Employee("張三","1234");
		Employee employee2 = new Employee("張四","1234");
		Employee employee3 = new Employee("張五","1234");
		List<Employee> employees = new ArrayList();
		employees.add(employee1);
		employees.add(employee2);
		employees.add(employee3);
		Company company = new Company("百度","百度大廈","3333",employees);
		
		ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("rectangle"));
        // 往流寫入對(duì)象
        o.writeObject(company);
        o.close();
        System.out.println("反序列化之前的雇員" + company.getEmployees());
        // 從流讀取對(duì)象
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("rectangle"));
        Company company1 = (Company)in.readObject();
        
        System.out.println("反序列化之后的雇員" + company1.getEmployees());
	}

}

我們都知道如果Employee沒有實(shí)現(xiàn)Serializable。這樣序列化Company的時(shí)候,會(huì)拋出異常 java.io.NotSerializableException。

這是因?yàn)闊o法序列化Company中變量Employee。但是使用transient可以實(shí)現(xiàn)部分序列化。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot加載外部依賴過程解析

    SpringBoot加載外部依賴過程解析

    這篇文章主要介紹了SpringBoot加載外部依賴過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 基于binarywang封裝的微信工具包生成二維碼

    基于binarywang封裝的微信工具包生成二維碼

    這篇文章主要介紹了基于binarywang封裝的微信工具包生成二維碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • java對(duì)象轉(zhuǎn)換String類型的三種方法

    java對(duì)象轉(zhuǎn)換String類型的三種方法

    在很多情況下我們都需要將一個(gè)對(duì)象轉(zhuǎn)換為String類型。一般來說有三種方法可以實(shí)現(xiàn):Object.toString()、(String)Object、String.valueOf(Object)。下面對(duì)這三種方法一一分析
    2013-11-11
  • javaSE基礎(chǔ)如何通俗的理解javaBean是什么

    javaSE基礎(chǔ)如何通俗的理解javaBean是什么

    所謂的Java Bean,就是一個(gè)java類,編譯后成為了一個(gè)后綴名是 .class的文件。這就是Java Bean,很多初學(xué)者,包括當(dāng)年的我自己,總是被這些專有名詞搞的暈頭轉(zhuǎn)向
    2021-10-10
  • 基于idea把springboot項(xiàng)目部署到docker

    基于idea把springboot項(xiàng)目部署到docker

    這篇文章主要介紹了基于idea把springboot項(xiàng)目部署到docker,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • SpringBoot請(qǐng)求映射的五種優(yōu)化方式小結(jié)

    SpringBoot請(qǐng)求映射的五種優(yōu)化方式小結(jié)

    在Spring?Boot應(yīng)用開發(fā)中,請(qǐng)求映射(Request?Mapping)是將HTTP請(qǐng)求路由到相應(yīng)控制器方法的核心機(jī)制,合理優(yōu)化請(qǐng)求映射不僅可以提升應(yīng)用性能,還能改善代碼結(jié)構(gòu),增強(qiáng)API的可維護(hù)性和可擴(kuò)展性,本文將介紹5種Spring?Boot請(qǐng)求映射優(yōu)化方式,需要的朋友可以參考下
    2025-06-06
  • Java數(shù)據(jù)結(jié)構(gòu)之對(duì)象比較詳解

    Java數(shù)據(jù)結(jié)構(gòu)之對(duì)象比較詳解

    這篇文章主要為大家詳細(xì)介紹了Java中對(duì)象的比較、集合框架中PriorityQueue的比較方式以及PriorityQueue的模擬實(shí)現(xiàn),感興趣的可以了解一下
    2022-07-07
  • Spring Boot Actuator端點(diǎn)相關(guān)原理解析

    Spring Boot Actuator端點(diǎn)相關(guān)原理解析

    這篇文章主要介紹了Spring Boot Actuator端點(diǎn)相關(guān)原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java線程操作的常見方法【線程名稱獲取、設(shè)置、線程啟動(dòng)判斷等】

    Java線程操作的常見方法【線程名稱獲取、設(shè)置、線程啟動(dòng)判斷等】

    這篇文章主要介紹了Java線程操作的常見方法,結(jié)合實(shí)例形式總結(jié)分析了java線程的創(chuàng)建、線程名稱的獲取、設(shè)置以及線程啟動(dòng)的判斷等相關(guān)操作實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-10-10
  • Spring Bean生命周期源碼原理圖解

    Spring Bean生命周期源碼原理圖解

    這篇文章主要介紹了Spring Bean生命周期源碼原理圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10

最新評(píng)論

日土县| 宁波市| 茌平县| 东乡县| 平舆县| 化州市| 宽城| 大厂| 四会市| 图们市| 河南省| 平山县| 肥乡县| 威信县| 清流县| 和田市| 华容县| 南安市| 眉山市| 保亭| 历史| 蛟河市| 龙泉市| 安乡县| 乌鲁木齐县| 上高县| 射洪县| 集安市| 奈曼旗| 沽源县| 康平县| 左权县| 扎鲁特旗| 澎湖县| 邵武市| 宁乡县| 乐平市| 平定县| 大方县| 南郑县| 通许县|