AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

面試官:Transient關鍵字修飾的變量當真不可序列化?

來源: 責編: 時間:2024-06-27 17:13:00 106觀看
導讀一、寫在開頭在這篇文章中記錄一下之前自己面試時學到的東西,是關于transient關鍵字的,當時面試官問我IO的相關問題,基本上全答出來了,關于如何不序列化對象中某個字段時,我果斷的選擇了static和transient,但面試官緊接著問

一、寫在開頭

在這篇文章中記錄一下之前自己面試時學到的東西,是關于transient關鍵字的,當時面試官問我IO的相關問題,基本上全答出來了,關于如何不序列化對象中某個字段時,我果斷的選擇了static和transient,但面試官緊接著問了我:“transient關鍵字修飾的變量當真不可序列化嗎?”,這個問題直接給我整不確定了,因為以當時的知識儲備,這個問題確實不知道,最終虛心的向這位面試官請教,他告訴了我答案。cRp28資訊網——每日最新資訊28at.com

雖然那場面試我還是通過了,但是我沒去,哈哈!不過還是挺感謝那個耐心的面試官的,隨口的一個問題,其實大部分面試官是不會負責給你解答的。cRp28資訊網——每日最新資訊28at.com

二、案例測試

今天,我們就花一點時間,來把這個問題梳理一遍。我們先寫一個測試類,去看一下static和transient關鍵字修飾的字段,在序列化過程中的表現:cRp28資訊網——每日最新資訊28at.com

public class Test {    public static void main(String[] args) throws IOException {        //初始化對象信息        Person person = new Person();        person.setName("JavaBuild");        person.setAge(30);        System.out.println(person.getName()+" "+person.getAge());        //序列化過程        try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("E://person.txt"));) {            objectOutputStream.writeObject(person);        } catch (IOException e) {            e.printStackTrace();        }        person.par1 = "序列化后靜態字段";        //反序列化過程        try (ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("E://person.txt"));) {            Person p = (Person) objectInputStream.readObject();            System.out.println(p);        } catch (IOException | ClassNotFoundException e) {            e.printStackTrace();        }    }}class Person implements Serializable{    private static final long serialVersionUID = 8711922740433840551L;    private String name;    private int age;    public static String par1 = "靜態字段";    transient String par2 = "臨時字段";    transient int high = 175;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    @Override    public String toString() {        return "Person{" +                "name='" + name + '/'' +                ", age=" + age +                ", par1=" + par1 +                ", high=" + high +                ", par2='" + par2 + '/'' +                '}';    }}

輸出:cRp28資訊網——每日最新資訊28at.com

JavaBuild 30Person{name='JavaBuild', age=30, par1=序列化后靜態字段, high=0, par2='null'}

通過打印結果我們可以看到,static修飾的字段,并沒有參與序列化,讀取到了后面修改的值;transient關鍵字修飾的字段也沒參與,而且在反序列化過程中,會被重置為默認值,例如基本數據類型為 0,引用類型為 null。至于原因我們在這里不展開了,上一篇文章里已經提到,大家可以去看看。cRp28資訊網——每日最新資訊28at.com

三、直入主題

我們再回過頭來看看起初的問題:transient 修飾的字段真的不能被序列化?至少通過Serializable接口標示的序列化方式里,transient字段時不可被序列化的,因為在序列化過程中調用的ObjectStreamClass對象,里面有個方法為getDefaultSerialFields(),已經明確的標記出了transient修飾符不可被序列化!cRp28資訊網——每日最新資訊28at.com

圖片圖片cRp28資訊網——每日最新資訊28at.com

那我們怎么辦呢?cRp28資訊網——每日最新資訊28at.com

Externalizable接口:

其實呀,除了 Serializable 之外,Java 還提供了一個序列化接口 Externalizable,它是Serializable的子接口,使用 Externalizable 進行反序列化的時候,會調用被序列化類的無參構造方法去創建一個新的對象,然后再將被保存對象的字段值復制過去;實現Externalizable接口時,必須重寫其中的writeExternal() 和 readExternal()方法,我們通過這兩個方法進行序列化的設計與讀取。cRp28資訊網——每日最新資訊28at.com

圖片圖片cRp28資訊網——每日最新資訊28at.com

適應場景: 因為Externalizable接口擁有著更高的序列化控制能力,所以在序列化過程中,我們需要對一些敏感信息進行加密處理時,它的作用就會體現啦。cRp28資訊網——每日最新資訊28at.com

我們使用這個接口進行序列化嘗試,并且使用transient關鍵字修飾字段,看一下結果:cRp28資訊網——每日最新資訊28at.com

public class Test implements Externalizable {    private transient String text = "我可以被序列化!??!";    public static void main(String[] args) throws Exception {        Test test = new Test();        //序列化        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("E://transient.txt"));        out.writeObject(test);        //反序列化        ObjectInputStream in = new ObjectInputStream(new FileInputStream("E://transient.txt"));        test = (Test)in.readObject();        System.out.println(test.text);        //關閉流        out.close();        in.close();    }    @Override    public void writeExternal(ObjectOutput out) throws IOException {        out.writeObject(text);    }    @Override    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {        text = (String) in.readObject();    }}

輸出:cRp28資訊網——每日最新資訊28at.com

我可以被序列化?。。?/code>

數據成功被序列化到txt文件中,并成功的反序列化讀取到程序中了!即便text被transient修飾著!cRp28資訊網——每日最新資訊28at.com

四、總結

通過上面的學習,我們知道了在Java的序列化中有 Serializable、Externalizable這兩個接口,前者沒有任何方法,只是一個標識,而后者作為子類,提供了必須重寫的方法,用以自定義序列化設計。此外,transient 關鍵字只能修飾字段,而不能修飾方法和類,需要注意。cRp28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-96974-0.html面試官:Transient關鍵字修飾的變量當真不可序列化?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 萌獸醫館三年敏捷 BI 建設之旅,攜手觀遠數據推進數字化革新

下一篇: 我們一起聊聊如何通過流式渲染提升用戶體驗?

標簽:
  • 熱門焦點
  • 小米降噪藍牙耳機Necklace分享:聽一首歌 讀懂一個故事

    在今天下午的小米Civi 2新品發布會上,小米還帶來了一款新的降噪藍牙耳機Necklace,我們也在發布結束的第一時間給大家帶來這款耳機的簡單分享。現在大家能見到最多的藍牙耳機
  • 7月安卓手機性能榜:紅魔8S Pro再奪榜首

    7月份的手機市場風平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領先版處理器的新機之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機廠商修整的時間,進入8月份之
  • 6月安卓手機好評榜:魅族20 Pro蟬聯冠軍

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年6月1日至6月30日,僅限國內市場。第一名:魅族20 Pro好評率:95%5月份的時候魅族20 Pro就是
  • 摸魚心法第一章——和配置文件說拜拜

    為了能摸魚我們團隊做了容器化,但是帶來的問題是服務配置文件很麻煩,然后大家在群里進行了“親切友好”的溝通圖片圖片圖片圖片對比就對比,簡單對比下獨立配置中心和k8s作為配
  • 企業采用CRM系統的11個好處

    客戶關系管理(CRM)軟件可以為企業提供很多的好處,從客戶保留到提高生產力?! RM軟件用于企業收集客戶互動,以改善客戶體驗和滿意度。  CRM軟件市場規模如今超過580
  • 微軟邀請 Microsoft 365 商業用戶,測試視頻編輯器 Clipchamp

    8 月 1 日消息,微軟近日宣布即將面向 Microsoft 365 商業用戶,開放 Clipchamp 應用,邀請用戶通過該應用來編輯視頻。微軟于 2021 年收購 Clipchamp,隨后開始逐步整合到 Microsof
  • 微博大門常打開,迎接海外畫師漂洋東渡

    作者:互聯網那些事“起猛了,我能看得懂日語了”。“為什么日本人說話我能聽懂?”“中文不像中文,日語不像日語,但是我竟然看懂了”…&hell
  • 3699元!iQOO Neo8 Pro頂配版今日首銷:1TB UFS 4.0同價位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標準版搭載高通驍龍8+,而Pro版更是首發搭載了聯發科天璣9200+旗艦
  • 由于成本持續增加,筆記本產品價格預計將明顯上漲

    根據知情人士透露,由于材料、物流等成本持續增加,筆記本產品價格預計將在2021年下半年有明顯上漲。進入6月下旬以來,全球半導體芯片缺貨情況加劇,顯卡、處理器
Top