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 Parcelable和Serializable的區別
本文主要介紹Parcelable和Serializable的作用、效率、區別及選擇,關於Serializable的介紹見Java 序列化的高階認識。 1、作用 Serializable的作用是為了儲存物件的屬性到本地檔案、資料庫、網路流、rmi以方便資料傳輸,當然這
Android系統中Parcelable和Serializable的區別
進行Android開發的時候,我們都知道不能將物件的引用傳給Activities或者Fragments,我們需要將這些物件放到一個Intent或者Bundle裡面,然後再傳遞。 通過Android的API,我們知道有兩種選擇,即在傳遞物件時,需要對我們的物
android Activity之間資料傳遞 Parcelable和Serializable介面的使用
Activity之間傳資料時,為了避免麻煩,往往會將一些值封裝成物件,然後將整個物件傳遞過去。傳物件的時候有兩種情況,一種是實現Parcelable介面,一種是實現Serializable介面。 0、解釋兩種介面: 1)實現Serializable介面是JavaSE本身就支
Parcelable和Serializable的區別
我們知道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 Sleep和Wait區別
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平臺。使用相對前者麻
Parcelable和Serializable的理解
很少在部落格上敲文字了,都是直接上程式碼就結束了,今天抽點時間寫點東西。 我們知道在一般情況下,在兩個或者多個Activity中傳遞資料中通過Intent的函式只能傳遞基本資料型別,那當我們想傳輸複雜的類的資料型別時候,我們就必須用到Parcelable
讀書筆記——Intent資料傳輸(Parcelable和Serializable)
putExtra() 最常用的Intent資料傳輸方式,簡單,在獲取的時候getIntent().getXXXExtra(),根據鍵值對獲取到對應的值。簡單方便。 缺點: 所支援的型別有限,比如不可傳遞自定義物件等。 傳遞物件——S
Android Service和IntentService區別及知識點詳細總結
Service 對於廣大的Android開發者來說算是耳熟能詳了,作為Android的四大元件之一,在我們的開發中也起著重要的作用,在Android面試中,Service相關的問題也是面試官問得比較多的,當別人問你,Service 到底是什麼的時候?你可能隨口就能答得上來,
Android序列化 Serializable使用和Parcelable 外掛化使用 以及兩者區別
當activity之間需要傳輸自定義的實體類物件時,就需要將資料序列化。有兩種方式可以實現:實現Serializable介面 和 實現Parcelable介面 Serializable: 是java提供的一個序列化介面,是個空介面,為物件提供標準的
java android 序列號serializable和parcelable
exceptio 對象的引用 undle ktr 實現原理 輸出 fin 使用 讀者 why 為什麽要了解序列化?—— 進行Android開發的時候,無法將對象的引用傳給Activities或者Fragments,我們需要將這些對象放到一個Intent或者Bundle裏面,
Android Dialog和PopWindow的區別
從效果上去總結看,dialog和popWindow在一般的彈出效果上能做到一樣的效果,但是dialog預設在螢幕的居中彈出,popWindow則可以更靈活的通過設定動化效果,從上下左右邊緣地帶彈出來,還能更方便的控制顯示在螢幕上的位置,在show
Android:assests和raw的區別
*res/raw和assets的相同點: 1.兩者目錄下的檔案在打包後會原封不動的儲存在apk包中,不會被編譯成二進位制。 *res/raw和assets的不同點: 1.res/raw中的檔案會被對映到R.java檔案中,訪問的時候直接使用資源ID即R.id.filena
Android dialog和popupwiondow的區別
其中最本質的差別就是:AlertDialog是非阻塞式對話方塊:AlertDialog彈出時,後臺還可以做事情;而PopupWindow是阻塞式對話方塊:PopupWindow彈出時,程式會等待,在PopupWindow退出前,程式一直等待,只有當我們呼叫了dismiss方法的後,PopupWind
Android Project和app中兩個build.gradle配置的區別
一般建立一個android專案後回出現兩個gradle:一個build.gradle(app),一個build.gradle(Project),顧名思義就是一個是用來配置整個工程的的一個是用來配置app的。 一、gradle中dependencies 的區別:下面英文就是對compile和c
Android Dialog和PopWindow的區別
從效果上去總結看,dialog和popWindow在一般的彈出效果上能做到一樣的效果,但是dialog預設在螢幕的居中彈出,popWindow則可以更靈活的通過設定動化效果,從上下左右邊緣地帶彈出來,還能更方便的控制顯示在螢幕上的位置,在showAtLocati
Android Service和Thread的區別
Service既不是程序也不是執行緒,它們之間的關係如下: 可能有的朋友會問了,既然是長耗時的操作,那麼Thread也可以完成啊。沒錯,在程式裡面很多耗時工作我們也可以通過Thread來完成,那麼還需要Service幹嘛呢。接下來就為大家解釋以下Serv
android layout gravity和android gravity屬性的區別
android:gravity / android:layout_gravity區別: android:gravity 是設定該view裡面的內容相對於該view的位置,例如設定button裡面的text相對於view的靠左,居中等位置。(也可以在Layout佈局屬性中新增,設定Layout中元件的位置)