1. 程式人生 > >Android Parcelable和Serializable的區別

Android Parcelable和Serializable的區別

本文主要介紹Parcelable和Serializable的作用、效率、區別及選擇,關於Serializable的介紹見Java 序列化的高階認識

1、作用

Serializable的作用是為了儲存物件的屬性到本地檔案、資料庫、網路流、rmi以方便資料傳輸,當然這種傳輸可以是程式內的也可以是兩個程式間的。而Android的Parcelable的設計初衷是因為Serializable效率過慢,為了在程式內不同元件間以及不同Android程式間(AIDL)高效的傳輸資料而設計,這些資料僅在記憶體中存在,Parcelable是通過IBinder通訊的訊息的載體。

從上面的設計上我們就可以看出優劣了。

2、效率及選擇

Parcelable的效能比Serializable好,在記憶體開銷方面較小,所以在記憶體間資料傳輸時推薦使用Parcelable,如activity間傳輸資料,而Serializable可將資料持久化方便儲存,所以在需要儲存或網路傳輸資料時選擇Serializable,因為android不同版本Parcelable可能不同,所以不推薦使用Parcelable進行資料持久化

3、程式設計實現

對於Serializable,類只需要實現Serializable介面,並提供一個序列化版本id(serialVersionUID)即可。而Parcelable則需要實現writeToParcel、describeContents函式以及靜態的CREATOR變數,實際上就是將如何打包和解包的工作自己來定義,而序列化的這些操作完全由底層實現

Parcelable的一個實現例子如下

public class MyParcelable implements Parcelable {
     private int mData;
     private String mStr;

     public int describeContents() {
         return 0;
     }

     // 寫資料進行儲存
     public void writeToParcel(Parcel out, int flags) {
         out.writeInt(mData);
         out.writeString(mStr);
     }

     // 用來建立自定義的Parcelable的物件
     public static final Parcelable.Creator<MyParcelable> CREATOR
             = new Parcelable.Creator<MyParcelable>() {
         public MyParcelable createFromParcel(Parcel in) {
             return new MyParcelable(in);
         }

         public MyParcelable[] newArray(int size) {
             return new MyParcelable[size];
         }
     };
     
     // 讀資料進行恢復
     private MyParcelable(Parcel in) {
         mData = in.readInt();
         mStr = in.readString();
     }
 }

從上面我們可以看出Parcel的寫入和讀出順序是一致的。如果元素是list讀出時需要先new一個ArrayList傳入,否則會報空指標異常。如下:

list = new ArrayList<String>();
in.readStringList(list);

 PS: 在自己使用時,read資料時誤將前面int資料當作long讀出,結果後面的順序錯亂,報如下異常,當類欄位較多時務必保持寫入和讀取的型別及順序一致

11-21 20:14:10.317: E/AndroidRuntime(21114): Caused by: java.lang.RuntimeException: Parcel [email protected]: Unmarshalling unknown type code 3014773 at offset 164

4、高階功能上

Serializable序列化不儲存靜態變數,可以使用Transient關鍵字對部分欄位不進行序列化,也可以覆蓋writeObject、readObject方法以實現序列化過程自定義

其他:

參考:


相關推薦

Android ParcelableSerializable區別

本文主要介紹Parcelable和Serializable的作用、效率、區別及選擇,關於Serializable的介紹見Java 序列化的高階認識。 1、作用 Serializable的作用是為了儲存物件的屬性到本地檔案、資料庫、網路流、rmi以方便資料傳輸,當然這

Android系統中ParcelableSerializable區別

進行Android開發的時候,我們都知道不能將物件的引用傳給Activities或者Fragments,我們需要將這些物件放到一個Intent或者Bundle裡面,然後再傳遞。 通過Android的API,我們知道有兩種選擇,即在傳遞物件時,需要對我們的物

android Activity之間資料傳遞 ParcelableSerializable介面的使用

Activity之間傳資料時,為了避免麻煩,往往會將一些值封裝成物件,然後將整個物件傳遞過去。傳物件的時候有兩種情況,一種是實現Parcelable介面,一種是實現Serializable介面。 0、解釋兩種介面: 1)實現Serializable介面是JavaSE本身就支

ParcelableSerializable區別

我們知道andriod在本地儲存物件或者用intent傳遞物件的時候,需要把物件序列化才能夠對其進行操作,在java中我們所熟悉的是物件實現serializable介面即可,而在andriod中官方推薦使用的是Parcelable介面,兩者有什麼區別呢? 1.Seriali

小白秒懂系列之 Parcelable Serializable 的 使用 以及他們的 區別

對這兩個單詞我想都不陌生吧,都知道是用來序列化的,可是為什麼要序列化呢? 永久性儲存 物件,儲存物件的位元組序列到本地檔案; 序列化的物件可以在網路中傳遞; 序列化的物件可以在程序間傳遞。 那麼我們知道它的用處了,可是如何選擇呢?(Parcelable簡

Android @id@+id區別

文件 int 十六進制 存在 變量 android中 target r.java文件 需要   Android中的組件需要用一個int類型的id屬性值來表示。id屬性只能接受資源類型的值,也就是必須以@開頭的值,例如,@id/abc、@+id/xyz等。如果在@後面使用“+

Android SleepWait區別

1、這兩個方法來自不同的類,sleep來自Thread類,wait 來自Object類。   sleep是Thread的靜態類方法,誰呼叫的誰去睡覺,即使是在a執行緒離呼叫了b的sleep方法,實際上還是a 去睡覺,要讓b去睡覺要在b的程式碼中呼叫sleep. 2、最主要

序列化Parcelable Serializable

Serializable、Parcelable 都可實現序列化,並用於Intent傳遞資料。 Serializable是java的序列化介面,使用簡單但開銷大,序列化和反序列化過程需大量I/O操作。 Parcelable是Android的序列化方式,因此更適用於Android平臺。使用相對前者麻

ParcelableSerializable的理解

很少在部落格上敲文字了,都是直接上程式碼就結束了,今天抽點時間寫點東西。 我們知道在一般情況下,在兩個或者多個Activity中傳遞資料中通過Intent的函式只能傳遞基本資料型別,那當我們想傳輸複雜的類的資料型別時候,我們就必須用到Parcelable

讀書筆記——Intent資料傳輸(ParcelableSerializable

putExtra() 最常用的Intent資料傳輸方式,簡單,在獲取的時候getIntent().getXXXExtra(),根據鍵值對獲取到對應的值。簡單方便。 缺點: 所支援的型別有限,比如不可傳遞自定義物件等。 傳遞物件——S

Android ServiceIntentService區別及知識點詳細總結

Service 對於廣大的Android開發者來說算是耳熟能詳了,作為Android的四大元件之一,在我們的開發中也起著重要的作用,在Android面試中,Service相關的問題也是面試官問得比較多的,當別人問你,Service 到底是什麼的時候?你可能隨口就能答得上來,

Android序列化 Serializable使用Parcelable 外掛化使用 以及兩者區別

當activity之間需要傳輸自定義的實體類物件時,就需要將資料序列化。有兩種方式可以實現:實現Serializable介面 和 實現Parcelable介面 Serializable: 是java提供的一個序列化介面,是個空介面,為物件提供標準的

java android 序列號serializableparcelable

exceptio 對象的引用 undle ktr 實現原理 輸出 fin 使用 讀者 why 為什麽要了解序列化?—— 進行Android開發的時候,無法將對象的引用傳給Activities或者Fragments,我們需要將這些對象放到一個Intent或者Bundle裏面,

Android DialogPopWindow的區別

       從效果上去總結看,dialog和popWindow在一般的彈出效果上能做到一樣的效果,但是dialog預設在螢幕的居中彈出,popWindow則可以更靈活的通過設定動化效果,從上下左右邊緣地帶彈出來,還能更方便的控制顯示在螢幕上的位置,在show

Android:assestsraw的區別

*res/raw和assets的相同點: 1.兩者目錄下的檔案在打包後會原封不動的儲存在apk包中,不會被編譯成二進位制。 *res/raw和assets的不同點: 1.res/raw中的檔案會被對映到R.java檔案中,訪問的時候直接使用資源ID即R.id.filena

Android dialogpopupwiondow的區別

其中最本質的差別就是:AlertDialog是非阻塞式對話方塊:AlertDialog彈出時,後臺還可以做事情;而PopupWindow是阻塞式對話方塊:PopupWindow彈出時,程式會等待,在PopupWindow退出前,程式一直等待,只有當我們呼叫了dismiss方法的後,PopupWind

Android Projectapp中兩個build.gradle配置的區別

一般建立一個android專案後回出現兩個gradle:一個build.gradle(app),一個build.gradle(Project),顧名思義就是一個是用來配置整個工程的的一個是用來配置app的。   一、gradle中dependencies 的區別:下面英文就是對compile和c

Android DialogPopWindow的區別

       從效果上去總結看,dialog和popWindow在一般的彈出效果上能做到一樣的效果,但是dialog預設在螢幕的居中彈出,popWindow則可以更靈活的通過設定動化效果,從上下左右邊緣地帶彈出來,還能更方便的控制顯示在螢幕上的位置,在showAtLocati

Android ServiceThread的區別

Service既不是程序也不是執行緒,它們之間的關係如下:       可能有的朋友會問了,既然是長耗時的操作,那麼Thread也可以完成啊。沒錯,在程式裡面很多耗時工作我們也可以通過Thread來完成,那麼還需要Service幹嘛呢。接下來就為大家解釋以下Serv

android layout gravityandroid gravity屬性的區別

android:gravity / android:layout_gravity區別:  android:gravity 是設定該view裡面的內容相對於該view的位置,例如設定button裡面的text相對於view的靠左,居中等位置。(也可以在Layout佈局屬性中新增,設定Layout中元件的位置)