1. 程式人生 > >Serializable與Parcelable的使用方法及區別

Serializable與Parcelable的使用方法及區別

一、Serializable介面

Serializable介面是Java所提供的一個序列化介面,它是一個空介面,為物件提供標準的序列化和反序列化操作。使用Serializable來實現序列化相當簡單,只需要讓該類實現Serializable介面,並在該類的宣告中制定一個標識即可自動實現預設的序列化過程。例如:

public static final long serialVersionUID = 8711368828010083044L;
實際上,這個serialVersionUID也不是必須的,就實現序列化這個功能而言並無影響,但是會對反序列化產生一定的影響。下面舉一個例子,Person類實現了Serializable介面,即可進行序列化和反序列化。如下所示:
public class 
Person 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 ,因為這種情況下的序列化過程或比較複雜。

相關推薦

SerializableParcelable的使用方法區別

一、Serializable介面 Serializable介面是Java所提供的一個序列化介面,它是一個空介面,為物件提供標準的序列化和反序列化操作。使用Serializable來實現序列化相當簡單,只需要讓該類實現Serializable介面,並在該類的宣告中制定一個標識

hibernate架構之session中getload方法區別

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 字符串indexofsearch方法區別

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

線程的狀態有哪些,線程中的startrun方法區別

執行 時間片 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中nextnextLine方法區別

1. Java中的Scanner類中的方法next()與nextLine()都是吸取輸入控制檯輸入的字元 ①next()方法不會吸取字元前和後的空格/Tab,只吸取字元,開始吸取字元(字元前後不算) 直到遇到空格/Tab/回車擷取吸取 ②nextLine()吸取字元前後的空格/Tab鍵,回車鍵截

Java | 基礎歸納 | 靜態方法例項方法區別

靜態方法和例項方法的區別主要體現在兩個方面: 在外部呼叫靜態方法時,可以使用"類名.方法名"的方式,也可以使用"物件名.方法名"的方式。而例項方法只有後面這種方式。也就是說,呼叫靜態方法可以無需建立物件。 靜態方法在訪問本類的成員時,只允許訪問靜態成員(即靜態成員變數和靜態方法),而不允許訪問例項成員變數

python呼叫第三方工具(命令)的方法區別

一 前言 在上篇《關於os.popen你可能不知道的》中,提到了呼叫第三方工具或命令的os.popen方法,同時也指出了使用中可能遇到的坑。本文就介紹下python提供了哪些方法可以執行第三方工具或命令,以及它們的用法和區別。   二 主要方法 1.  os.system 這

jquery之attrprop方法區別

在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