Serializable與Parcelable的使用方法及區別
一、Serializable介面
Serializable介面是Java所提供的一個序列化介面,它是一個空介面,為物件提供標準的序列化和反序列化操作。使用Serializable來實現序列化相當簡單,只需要讓該類實現Serializable介面,並在該類的宣告中制定一個標識即可自動實現預設的序列化過程。例如:
public static final long serialVersionUID = 8711368828010083044L;實際上,這個serialVersionUID也不是必須的,就實現序列化這個功能而言並無影響,但是會對反序列化產生一定的影響。下面舉一個例子,Person類實現了Serializable介面,即可進行序列化和反序列化。如下所示:
public classPerson implements Serializable { public static final long serialVersionUID = 8711368828010083044L; public int personId; public String personName; public boolean isMale; public Person(int personId, String personName,boolean isMale ) { this.isMale = isMale; this.personId = personId; this.personName = personName; } }
通過Serializable方式實現物件的序列化,實現起來非常簡單,因為這種方法幾乎所有的工作都被系統自動完成了。
該物件的序列化和反序列化分別如下所示:
//物件的序列化 Person person = new Person(0,"jack",true); try { ObjectOutputStream outputStream = new ObjectOutputStream( new FileOutputStream("cache.txt")); outputStream.writeObject(person); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } //物件的反序列化 try { ObjectInputStream inputStream = new ObjectInputStream( new FileInputStream("cache.txt")); Person newPerson = (Person)inputStream.readObject(); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }
二、Parcelable介面
只要實現了Parcelable介面,一個類的物件就可以實現序列化並可以通過Intent和Binder傳遞。下面通過一個例子來講解Parcelable介面的序列化和反序列化:
public class User implements Parcelable { private int userId; private String userName; private boolean isMale; protected User(Parcel in) {
userId = in.readInt(); userName = in.readString(); isMale = in.readInt() == 1;} public User(boolean isMale, int userId, String userName) { this.isMale = isMale; this.userId = userId; this.userName = userName;} //反序列化public static final Creator<User> CREATOR = new Creator<User>() { //從序列化後的物件中建立原始物件@Overridepublic User createFromParcel(Parcel in) { return new User(in);} //建立指定長度的原始物件陣列@Overridepublic User[] newArray(int size) { return new User[size];} };//內容描述@Overridepublic int describeContents() { return 0;} //將當前物件寫入到序列化結構中@Overridepublic void writeToParcel(Parcel parcel, int i) { }} Parcel內部包裝了可序列化的資料,可以在Binder中自由傳輸。從上面的程式碼中我們可以看出,在序列化過程中需要實現的功能有序列化、反序列化和內容描述。序列化功能是由writeToParcel方法來完成,最終是通過Parcel中的一系列write方法來完成的。反序列化是由CREATOR來完成,其內部標明瞭如何建立序列化物件和陣列,並通過Parcel的一系列read方法來完成反序列化過程;內部描述功能由describeContents方法來完成,幾乎所有的情況下這個方法都應該返回0,僅噹噹前物件中存在檔案描述符時,此方法返回1。
三、區別
Serializable是Java中的序列化介面,使用起來簡單但是開銷很大,序列化和反序列化過程需要大量I/O操作。
Parcelable是Android中的序列化方式,因此更適合在Android平臺上,缺點是使用起來稍微麻煩一點,但其勝在效率高,這是Android推薦的序列化方式,因此我們首選Parcelable。但是如果要將物件序列化到儲存裝置中,或者將物件序列化後通過網路傳輸,此種情況下則推薦使用Serializable ,因為這種情況下的序列化過程或比較複雜。
相關推薦
Serializable與Parcelable的使用方法及區別
一、Serializable介面 Serializable介面是Java所提供的一個序列化介面,它是一個空介面,為物件提供標準的序列化和反序列化操作。使用Serializable來實現序列化相當簡單,只需要讓該類實現Serializable介面,並在該類的宣告中制定一個標識
hibernate架構之session中get與load方法的區別
r.java one 升級版 數據庫 apache appenders 進行 方法 main hibernate是一個用於連接數據庫的升級版JDBC,與一般JDBC不同的是,hibernate架構是通過hql進行查找,通過session建立連接。其工作原理是:將實例分為瞬時
linux系統中如何進入退出vim編輯器的方法及區別
sig bili 編輯器 html enter mil erl convert dstat 在linux家族中,vim編輯器是系統自帶的文本編輯器,其功能強大自不必說了。 偶有小白,剛接觸linux,要修改某個文本文件,不可能像WINDOWS那樣操作
C#中抽象方法與虛擬方法的區別
的人 -a 對象 abstract 數據 style html tools mar 學過C#的人應該都知道抽象方法與虛擬方法,而很多初學者對二者之間的區別並不是很了解。今天本文就來分析一下二者之間的區別。並附上實例加以說明。具體分析如下: 一、主要區別: 對於抽象方
淺析JavaScript訪問對象屬性和方法及區別
cti on() 對象方法 編寫程序 因此 brush new 函數 name 屬性是一個變量,用來表示一個對象的特征,如顏色、大小、重量等;方法是一個函數,用來表示對象的操作,如奔跑、呼吸、跳躍等。 在JavaScript中通常使用”."運算符來存取對象的屬性的值。或者使
js 字符串indexof與search方法的區別
indexof 返回 匹配 技術 語法 sea 表達 pan 並且 1.indexof方法 indexOf() 方法可返回某個指定的字符串值在字符串中首次出現的位置。 語法: 註意:有可選的參數(即設置開始的檢索位置)。 2、search方法 searc
C#中抽象方法與虛方法的區別
program 一個 註意事項 student 示例 創建 void 實現 pro 一、抽象方法:只在抽象類中定義,方法修飾符不能使用private,virtual,static. 抽象方法如下示: public abstract class People //聲明一個
Java 多線程 sleep()方法與wait()方法的區別
程序 一段 exc 非靜態方法 not mil java程序 div 推薦 sleep()方法會使線程暫停執行一段時間,wait()方法會阻塞線程,直到被喚醒或等待時間超時。 兩者區別具體如下: 1 原理不同 sleep()方法是Thread類的靜態方法,使
Java 多線程 sleep()方法與yield()方法的區別
就是 有關 方法 沒有 區別 sof interrupt 重新 線程 sleep()方法與yield()方法的區別如下: 1 是否考慮線程的優先級不同 sleep()方法給其他線程運行機會時不考慮線程的優先級,也就是說,它會給低優先級的線程運行的機會。而yiel
線程的狀態有哪些,線程中的start與run方法的區別
執行 時間片 lis 同步鎖 狀態轉換圖 block 三種 我們 相似性 線程在一定條件下,狀態會發生變化。線程一共有以下幾種狀態: 1、新建狀態(New):新創建了一個線程對象。 2、就緒狀態(Runnable):線程對象創建後,其他線程調用了該對象的start()方法。
淺談幸運28源碼下載FIle協議與Http協議及區別
文件file oct 信息 響應 ont view 升級 文件傳輸 協議 先看三段代碼: index.html: 復制代碼<!DOCTYPE html><html lang="en"><head><meta ch
Java中next與nextLine方法的區別
1. Java中的Scanner類中的方法next()與nextLine()都是吸取輸入控制檯輸入的字元 ①next()方法不會吸取字元前和後的空格/Tab,只吸取字元,開始吸取字元(字元前後不算) 直到遇到空格/Tab/回車擷取吸取 ②nextLine()吸取字元前後的空格/Tab鍵,回車鍵截
Java | 基礎歸納 | 靜態方法與例項方法的區別
靜態方法和例項方法的區別主要體現在兩個方面: 在外部呼叫靜態方法時,可以使用"類名.方法名"的方式,也可以使用"物件名.方法名"的方式。而例項方法只有後面這種方式。也就是說,呼叫靜態方法可以無需建立物件。 靜態方法在訪問本類的成員時,只允許訪問靜態成員(即靜態成員變數和靜態方法),而不允許訪問例項成員變數
python呼叫第三方工具(命令)的方法及區別
一 前言 在上篇《關於os.popen你可能不知道的》中,提到了呼叫第三方工具或命令的os.popen方法,同時也指出了使用中可能遇到的坑。本文就介紹下python提供了哪些方法可以執行第三方工具或命令,以及它們的用法和區別。 二 主要方法 1. os.system 這
jquery之attr與prop方法的區別
在jquery1.6版本之前,如果使用attr方法去設定沒有被設定的屬性,會返回undefined,在jquery1.6版本之後,為獲取並改變DOM的checked、disabled、selected等布林屬性,出現了prop()方法,使用prop方法,如果這三個值沒有設定,返回的是false,設定
初夏小談:C/C++防止標頭檔案被重複包含的兩種方法及區別
防止標頭檔案被重複包含的兩種方式: 1.條件編譯的巨集 2.#pragma once 先來說說第一種: #ifndef __HEADNAME__H__ #define __HEADNAME__H__ //... //標頭檔案 #endif C/C++標準支援
TP框架中D方法與M方法的區別
D()和M()方法的區別: D和M的區別主要在於 M方法不需要建立模型類檔案,M方法不會讀取模型類,所以預設情況下自動驗證是無效的,但是可以通過動態賦值的方式實現 而D方法必須有建立模型類。 我們可以用下面兩種方法去建立一個數據表的對映物件 第一種:$Test = D(‘Test
【Java】File類mkdir()與mkdirs()方法的區別
在java中File --》指--》檔案+檔案目錄 建立資料夾實現程式碼 //檔案存放path String strPath = "E:\\a\\aa\\aaa.txt"; File file = new File(strPath); //檔案存放p
【轉】linux系統中如何進入退出vim編輯器,方法及區別
在linux家族中,vim編輯器是系統自帶的文字編輯器,其功能強大自不必說了。 偶有小白,剛接觸linux,要修改某個文字檔案,不可能像WINDOWS那樣操作,更有甚者,進入VI編輯器後,無法退出以致強抽關機,確是不得以呀。 &nb
List的add方法與addAll方法的區別
add是將傳入的引數作為當前List中的一個Item儲存,即使你傳入一個List也只會另當前的List增加1個元素addAll是傳入一個List,將此List中的所有元素加入到當前List中,也就是當前List會增加的元素個數為傳入的List的大小 即addAll(Coll