編輯:關於Android編程
本文主要介紹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.CreatorCREATOR = new Parcelable.Creator () { 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(); in.readStringList(list);
PS: 在自己使用時,read數據時誤將前面int數據當作long讀出,結果後面的順序錯亂,報如下異常,當類字段較多時務必保持寫入和讀取的類型及順序一致。
11-21 20:14:10.317: E/AndroidRuntime(21114): Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@4126ed60: Unmarshalling unknown type code 3014773 at offset 164
4、高級功能上
Serializable序列化不保存靜態變量,可以使用Transient關鍵字對部分字段不進行序列化,也可以覆蓋writeObject、readObject方法以實現序列化過程自定義
其他:
android.os.BadParcelableException: ClassNotFoundException when unmarshalling
參考:
http://developer.android.com/reference/android/os/Parcelable.html
由於項目需要,我們需要一個可以橫向滾動的,又可以豎向滾動的 表格。而且又要考慮大數據量(行)的展示視圖。經過幾天的研究終於搞定,做了一個演示。貼圖如下: &nb
今天記錄一下TextView的倒影效果,顯示一串文字,然後在文字的下方顯示出它的倒影,先上效果圖:最重要的就是View中getDrawingCache()方法,該方法可以
本Demo的實現效果是調用手機上已安裝的照相機來實現拍照的功能,拍好的照片以ImageView形式展示。 目的:學習手機調用安裝的相機照相,對大的圖片處理有所認識,這裡主
android studio和eclipse 稍微有點不同。Android studio 版本1.3SqlCipher 版本3.3.11.將sqlcipher.jar復制