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

Android Parcelable 序列化复杂数据结构的更多相关文章

  1. android中实现Parcelable序列化步骤

    import java.io.Serializable; import java.text.DecimalFormat; import android.os.Parcel; import androi ...

  2. android对象序列化Parcelable浅析

    一.android序列化简介 我们已经知道在Android使用Intent/Bindler进行IPC传输数据时,需要将对象进行序列化. JAVA原本已经提供了Serializable接口来实现序列化, ...

  3. Android中Parcelable序列化总结

    在使用Parcelable对android中数据的序列化操作还是比较有用的,有人做过通过对比Serializable和Parcelable在android中序列化操作对象的速度比对,大概Parcela ...

  4. Android中Serializable和Parcelable序列化对象详解

    学习内容: 1.序列化的目的 2.Android中序列化的两种方式 3.Parcelable与Serializable的性能比较 4.Android中如何使用Parcelable进行序列化操作 5.P ...

  5. 几种Android数据序列化方案

    一.引言 数据的序列化在Android开发中占据着重要的地位,无论是在进程间通信.本地数据存储又或者是网络数据传输都离不开序列化的支持.而针对不同场景选择合适的序列化方案对于应用的性能有着极大的影响. ...

  6. Android 使用Parcelable序列化对象

    转:http://ipjmc.iteye.com/blog/1314145       Android序列化对象主要有两种方法,实现Serializable接口.或者实现Parcelable接口.实现 ...

  7. Android Parcelable理解与使用(对象序列化)

    http://my.oschina.net/zhoulc/blog/172163 parcel定义介绍: android提供了一种新的类型:parcel(英文解释:包裹,小包),本类用来封装数据的容器 ...

  8. 【Android - IPC】之Serializable和Parcelable序列化

    1.序列化的目的 (1)永久的保存对象数据(将对象数据保存到文件或磁盘中): (2)通过序列化操作将对象数据在网络上进行传输(由于网络传输是以字节流的方式对数据进行传输的,因此序列化的目的是将对象数据 ...

  9. Android Parcelable和Serializable的区别,androidparcelable

    本文主要介绍Parcelable和Serializable的作用.效率.区别及选择,关于Serializable的介绍见Java 序列化的高级认识. 1.作用 Serializable的作用是为了保存 ...

随机推荐

  1. 阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_01-Eureka注册中心-Eureka介绍

    1 Eureka注册中心 1.1 需求分析 在前后端分离架构中,服务层被拆分成了很多的微服务,微服务的信息如何管理?Spring Cloud中提供服务注册中 心来管理微服务信息. 为什么 要用注册中心 ...

  2. 简单模拟 Promise

    class promise { constructor(fn) { this.data = null; this.err = null; this.isPromise = false; this.er ...

  3. 普罗米修斯Prometheus监控安装

    普罗米修斯Prometheus监控安装 架构: 服务端:192.168.0.204 客户端:192.168.0.206 环境准备:所有节点安装go 语言环境 rz go1.12.linux-amd64 ...

  4. 【C/C++开发】C++实现简单的线程类

    C++封装一个简单的线程类 多线程编程简介: 大家在编程时,经常需要在程序中启动一个或多个线程来处理任务,而如果每次都是去调用系统创建线程的API函数来创建,代码量虽不多,但线程的创建和业务逻辑代码就 ...

  5. spring boot 单选按钮

    jsp代码 性别: <form:radiobutton path="xb" value="男"/>男 <form:radiobutton pa ...

  6. codevs1227:方格取数2

    题目描述 Description 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= )现在从(,)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该 ...

  7. oracle中row_number()的用法

    公司系统升级的时候需要数据迁移,遇到一个问题:新表的数据结构和旧表异构,旧表是流水号,新表是联合主键(业务号码+业务号码序号) 最后发现用窗口函数 row_number() + partition b ...

  8. 小程序使用mpvue框架无缝接入Vant Weapp组件库

    有美团开源出的mpvue以其vue的语法和良好的开发效率再搭配上用户体验良好的UI组件无疑是定制化微信小程序的开发方式,然而由于mpvue是对微信原生开发的再次封装,这也为我们引入UI组件添加了不少麻 ...

  9. iOS开发支付篇——内购(IAP)详解

    1 <em>内购所需要的资料整理总结,史上最完整的,哈哈哈哈哈哈</em> 思维导图 重点总结: 1 2 3 4 5 6 7 8 9 10 11 12 13 1.获取内购列表( ...

  10. CentOS7.0 yum安装 docker

    一.安装docker 1.Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker . root 用户登录操作! 通过  ...