不詩意的女程序媛不是好廚師~
轉載請註明出處,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這種序列化的方案,它的有點還是很突出的,那就是方便我們進行網絡調試,哪裏有問題,數據一看就知道了,可讀性槓槓滴。
積累點滴,做好自己~