參考博文 http://blog.csdn.net/yangzl2008/article/details/7593226
由於項目需要,Activity之間要傳遞一個特別復雜的數據結構對象,由於以前序列化直接是用Serializable,但是Serializable無法傳遞復雜的數據結構,查看Bundle的方法,知道了Parcelable
Parcelable的使用看起來挺復雜,其實也挺簡單,就是使用writeToParcel(Parcel dest,int flags)方法將自己類中的屬性寫入Parcel對象,接收的時候用CREATOR中的createFromParcel(Parcel in)解析出來。
我遇到的難點在於數據結構中有枚舉型和多層次的List集合:
由於Enum實現了Serializable接口,可以通過in.readSerializable()進行讀入,還可以通過enum對象的.ordinal()方法獲得枚舉值的索引寫入Parcel對象,在用in.readInt()讀出然后解析出枚舉值。
至於List集合的序列化就傷了我,說一下我做的過程吧。
1.Parcelable有兩個方法是ArrayList<MyClass> list = in.readArrayList(ClassLoader); in.readList(List , ClassLoader)這時候就涉及到ClassLoader參數的設置,查看源碼有好多的ClassLoader選擇,我當時就選擇了一個Serializable.class.getClassLoader()這個,然后序列化的結果是將List集合序列化成了一個數字,然后傳到下一個Activity中的適配器的時候就轉換錯誤。也就是這種方法沒解決問題,不過我想這種方法應該是能實現的,只是哪里還有問題,沒寫對。如果讀者有按這種思路實現了的我們可以交流交流。
2.Parcelable中還有個方法 in.readTypedList(recodeList,TrainRecode.CREATOR); 第一個參數是輸出的List集合,第二個參數是List子元素類中的CREATOR靜態常量。
按照這種方法試驗成功,序列化傳遞正常。
3.在StackOverFlow上看到的一種方法是
List<Object> myList = null; parcel.readList(myList,List.class.getClassLoader()); category.setCategoryVideos(myList);
使用的是List.class.getClassLoader()的類裝載器,不過我沒試過,不知道是否可行。
注意:其中在寫writeToParcel(...)方法和createFromParcel(...)方法中Parcel對象寫入和讀取的順序要一致,不然會出現順序異常和亂碼。