Android面試專題(十):序列化原理 深入再理解

不詩意的女程序媛不是好廚師~
轉載請註明出處,From李詩雨—https://blog.csdn.net/cjm2484836553/article/details/105180290

(PS:感覺面試的時候如果真的可以把這些點說出來,會顯得比較高級,而且還可以使我們的面試時間顯得很長,哈哈哈哈哈~)

在這裏插入圖片描述

面試官:“你能說一下Java 與 Android 的序列化原理嗎?”

是的,我們之前複習了一遍《Serializable 和 Parcelable 的區別》,但是 Serializable接口 和 Parcelable接口並不等於序列化,如果要再讓我們講一下序列化的原理,我們就要再多知道一點。

首先我們要明白一個概念:什麼是序列化?

  • 序列化與反序列化都是一個過程,它並不是一個接口!

    序列化就是說當我需要保存信息到內存中或者文件裏的時候,我要對這些信息做一些標記和標準規範。

    反序列化就是 將來要用到這些信息的時候 可以按照你保存時的邏輯 恢復成你保存之前的樣子。

再拿個現實生活中例子,來形象的類比一下。

大家都有搬家的經歷,在搬家的時候,比如你有一個很大的可拆卸的櫃子,這個時候爲了方便,我們會把櫃子拆卸之後裝箱,在拆卸裝箱的時候我會做一些標記,或者制定一些標準,因爲我要保證我拆過之後,還能把它拼回原樣。—那這種做標記或者按照標準裝箱的過程,我們就可以把它理解爲序列化。

到了新家之後,我們拆開箱子,按照之前做的標記(或者定下的標準)我們能夠很容易的把櫃子恢復成原來的樣子。—那這種遵循一定的規則能夠恢復原樣的過程,我們就可以把它理解爲反序列化。

所以,這個時候我們明白了 Serializable 和 Parcelable 只是實現序列化的手段之一二而已。

下面,我再來深入的看看它們到底是怎麼實現序列化的,原理又是什麼?

先說Serializable吧,下面是它的源代碼:
在這裏插入圖片描述
恩,你可以看到Serializable接口是空的!

  • 既然是空的,它是怎麼做到序列化的呢?

    其實啊,這個接口本身並沒有做什麼,它在這裏只是充當了標記的作用。

    有沒有發現,在源碼的註釋裏有ObjectOutputStream、ObjectIntputStream、ObjectOutput、ObjectInput。

    這就是說,只要你的類打上了“Serializable”這個標記,就可以使用outputStream這個流把它寫出去,如果沒有打上這個標記你就去用流寫的話,它就會拋出一個異常。

  • 那打上這個標記之後,它是如何做到序列化與反序列化的呢?

    這後續的操作就是由JDK自己完成的了。

    比如說我現在有一個Student類 要通過io流把它寫到文件中去,這個時候我就必須讓它實現Serializable接口。

    使用之後,當你用流去寫的時候,jdk自己就會把這個類中的所有屬性(類型/值/名字等所有信息)打包寫到一個文件中去。

    這樣在以後別人要用它的時候,就能根據標記來恢復,這是一個逆向的過程,所以叫做反序列化。

    當然,它底層其實是用的反射,用反射去獲取類的屬性、名字等等信息。

由於Parcelable是android提供的一個接口。所以它就不再是空的實現了。

還是讓我們來看一看源碼吧:
在這裏插入圖片描述

因爲Parcelable要自己去實現序列化與反序列化,所以它的使用就複雜了很多,在它的註釋中也告訴了我們如何去實現Parcelable.

當我們序列化的時候就會去調用writeToParcel()方法,把數據記錄到Parcel裏去。

它序列化和反序列化的順序必須相同,不需要藉助io。

通看下來,我們可以知道:

  • Serializable是JDK的規則,具體的序列化 反序列化操作都是有jdk完成的。

  • Parcelable需要程序員來自己實現序列化與反序列化過程,所以Parcelable使用的時候效率要比Serializable高,但是使用的時候要比Serializable複雜(自己寫代碼)。

  • 但是我們也發現:他們二者的共同目的是相同的—即把我們的數據按照一定的規則記錄下來,如果你需要反序列化的時候 就把數據按照規則給解析恢復出來。

到此我們深深的體會到了 序列化與反序列化都是一個過程,並不是一個接口這句話了。

並且我們也體會並理解了Serializable、Parcelable都只是實現序列化與反序列的一種方式、一種規則而已。

那我們不經又想到,我們會經常向網絡傳輸數據,也會從網絡上獲取數據。而它們並沒有實現Serializable/Parcelable,那它們又是怎麼做的序列化與反序列化的呢?

這個問題其實也不難,大家想想我們在進行網絡數據傳輸的時候都是用的什麼呀?

是不是Gson啊、FastJson啊之類的,那我們不難猜測,它們肯定也去實現了序列化與反序列化,只是它們用的是自己的規則而已,比如json。

json這種序列化的方案,它的有點還是很突出的,那就是方便我們進行網絡調試,哪裏有問題,數據一看就知道了,可讀性槓槓滴。

積累點滴,做好自己~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章