参考博文 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对象写入和读取的顺序要一致,不然会出现顺序异常和乱码。

最新文章

  1. c#过滤html标签
  2. 手工给Meteor增加smart package的方法
  3. BZOJ 2743 树状数组
  4. for循环的省略
  5. C#在excel中添加超链接
  6. PHP中include和require(转)
  7. Insert Interval
  8. Web Api学习一
  9. Javascript类型检测
  10. cocos2d-x介绍
  11. 201521123091 《Java程序设计》第8周学习总结
  12. ElGamal密码
  13. 从PRISM开始学WPF(六)MVVM(二)Command-更新至Prism7.1
  14. JVM内存问题分析
  15. A1079. Total Sales of Supply Chain
  16. nodejs(一)process模块
  17. PAT 1020 月饼 (25)(精简版代码+思路+推荐测试用例)
  18. c#复习提纲
  19. TuShare获取K线数据
  20. TempData,跳转后的提醒

热门文章

  1. (十二)Centos之关机和重启
  2. php利用文件进行排他型锁定,防止并发
  3. c#.net从ftp下载文件到本地
  4. js 如何让两个等长的数组产生键值对关系
  5. scdbg分析shellcode
  6. iOS技术面试05:UI控件
  7. Django:django后台传递数据到js中
  8. XMemcached的基本使用
  9. Memcache安装配置
  10. 【leetcode算法-简单】28. 实现strStr