序列化(Serializable和Parcelable介面)詳解
阿新 • • 發佈:2019-02-03
1.什麼是序列化?
就是一種處理物件流的機制。所謂物件流就是將物件的內容進行流化,我們可以對流化後的物件進行讀寫操作。也可以將流化後的物件傳輸於網路之間。
2.序列化的實現:
將需要被序列化的類實現Serializalbe,該介面沒有需要實現的方案,只是為了標識該物件是可被序列化的,然後使用一個輸出流來構造一個ObjectOutputStream(物件流)物件,使用物件流的物件的writeObject(),方法將引數為obj的物件寫出,要恢復的話則用輸入流,
如果在序列化的過程中,有些資料欄位不是我們想將其序列化的,對於此類欄位我們只需要定義時加上transient關鍵字即可,關於transient欄位序列化機制會跳過不會將其寫入檔案,當然也不可恢復,
但是有時候我們想某一欄位序列化,但是在sdk中的定義卻是不可序列化型別,這樣我們必須把他標註為transient,
序列化機制為包含這種特殊問題的類提供如下的方法:
private void readObject(ObjectInputStream in) throws
IOException, ClassNotFoundException;
private void writeObject(ObjectOutputStream out) throws
IOException;
(注:這些方法定義時必須是私有的,因為不需要你顯示呼叫,序列化機制會自動呼叫的)
所以簡單的說:
java序列化是指把java物件轉換為位元組序列化的過程,而java反序列化是指把位元組序列恢復為java
物件過程。
3.為什麼需要序列化和反序列化:
當兩個程序之間需要遠端通訊時,可以相互發送各種型別的資料,而這些資料都會以二進位制序列的形式在網路上傳送,通過java序列化與反序列化實現兩個java程序通訊,
4.如何做到?
1)傳送方需要把這個java物件轉換為位元組序列,然後在網上傳送。
2)接收方需要從位元組序列中恢復java物件。
5.java序列化的好處
1)資料的永續性。(通過序列化永久的儲存到硬碟上)
2)實現遠端通訊,(在網上傳送物件的位元組序列)
6.Serializable和Parcelable介面可以完成物件的序列化過程。當我們需要Intent和Binder傳輸資料時就
需要使用Serializable和Pracelable,還有時我們需要把物件的持久化到儲存裝置上或者通過網路傳輸給其他客戶端。
Serializalbe介面
serializable是java所提供的一個序列化介面,它是一個空介面,為對提供標準的序列化和反序列化操作,
如何進行物件的序列化和反序列化操作:
只需要採用ObjectOutputStream和ObjectInoutStream即可輕鬆實現,
serialVersionUID(序列化時宣告的一個長字串)
它的詳細機制是:序列化的時候系統會把當前類的serialVersionUID寫入序列化檔案中,當反序列化的時候系統會去檢測檔案中的serialVersionUID,看他是否和當前類的一致,如果一致,說明序列化類的版本和當前類的版本是相同的,這個時候成功反序列化,否則說明當前類和序列化的類相比發生某些變換,這個時候無法正常反序列化,會報錯:
Parcelable介面 Parcelable也是一個介面,只要實現這個介面,一個類的物件就可以實現序列化並可以通過Intent和 Binder傳遞,典型案例:
Parcel內部包裝了可序列化資料,也可以在Binder中自由傳輸,在序列化過程中需要實現的功能有序列化,反序列化和內容描述: 序列化功能由writeToPacel來完成,最終是通過Parcel中的一系列write方法來完成的, 反序列化是由CREATOR來完成,其內部標明如何建立序列化物件和陣列,並通過Parcel的一系列read方法來完成反序列化過程, 內容描述功能由describeContents方法來完成,幾乎所有情況下這個方法都返回0, 當物件中存在檔案描述符時,返回1.
Parcelable與serializable都可以在Intent間傳遞資料,該如何選取? Serializable是java中的序列化介面,並且使用起來簡單,但是開銷很大,序列化和反序列化過程需要 大量的I/O操作,而Pracelable是android中的序列化,更適合在android平臺上,缺點是使用起來麻煩,但是它的效率高,這是android推薦的序列化方式, 通過Parcelable將物件序列化到儲存裝置中或者將物件序列化後通過網路傳輸也都是可以的,但是過程稍微複雜,因此在這兩種情況下建議大家使用Serializable
serialVersionUID(序列化時宣告的一個長字串)
它的詳細機制是:序列化的時候系統會把當前類的serialVersionUID寫入序列化檔案中,當反序列化的時候系統會去檢測檔案中的serialVersionUID,看他是否和當前類的一致,如果一致,說明序列化類的版本和當前類的版本是相同的,這個時候成功反序列化,否則說明當前類和序列化的類相比發生某些變換,這個時候無法正常反序列化,會報錯:
Parcelable介面 Parcelable也是一個介面,只要實現這個介面,一個類的物件就可以實現序列化並可以通過Intent和 Binder傳遞,典型案例:
Parcel內部包裝了可序列化資料,也可以在Binder中自由傳輸,在序列化過程中需要實現的功能有序列化,反序列化和內容描述: 序列化功能由writeToPacel來完成,最終是通過Parcel中的一系列write方法來完成的, 反序列化是由CREATOR來完成,其內部標明如何建立序列化物件和陣列,並通過Parcel的一系列read方法來完成反序列化過程, 內容描述功能由describeContents方法來完成,幾乎所有情況下這個方法都返回0, 當物件中存在檔案描述符時,返回1.
Parcelable與serializable都可以在Intent間傳遞資料,該如何選取? Serializable是java中的序列化介面,並且使用起來簡單,但是開銷很大,序列化和反序列化過程需要 大量的I/O操作,而Pracelable是android中的序列化,更適合在android平臺上,缺點是使用起來麻煩,但是它的效率高,這是android推薦的序列化方式, 通過Parcelable將物件序列化到儲存裝置中或者將物件序列化後通過網路傳輸也都是可以的,但是過程稍微複雜,因此在這兩種情況下建議大家使用Serializable