简单地说,“序列化”就是将运行时的对象状态转换成二进制,然后保存到流,内存或者通过网络传输给其他端.
两者最大的区别在于 存储媒介的不同,Serializable使用 I/O 读写存储在硬盘上, 而 Parcelable是直接在内存中读写. 很明显,内存的读写速度通常大于 IO 读写,所以在Android中传递数据优先选择 Parcelable. Serializable会使用反射,序列化和反序列化过程需要大量I/O 操作. Parcelable 自已实现封送和解封(marshalled&unmarshalled)操作不需要用反射, 数据也存放在 Native 内存中,效率要快很多.
Serializable在序列化反序列化过程中使用反射并且会产生大量临时对象. Serializable的序列化与反序列化分别通过ObjectOutputStream和ObjectInputStream 进行.
Parcelable方式的实现原理是将一个完整的对象进行分解, 而分解后的每一部分都是Intent所支持的数据类型,这样也就实现传递对象的功能了
在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同, 所以不推荐使用Parcelable进行数据持久化.
Parcelable不能使用在要将数据存储在磁盘上的情况, 因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下.
若将Parcel看成是一个流,则先通过writeToParcel把对象写到流里面, 再通过createFromParcel从流里读取对象,因此类实现的写入顺序和读出顺序必须一致
在两个Activity之间传递对象需要注意 对象的大小
Intent 中的 Bundle 是使用 Binder 机制进行数据传送的. 能使用的 Binder 的缓冲区是有大小限制的(有些手机是2M). 一个进程默认有16个Binder线程,所以一个线程能占用的缓冲区就更小了(大约一个线程可以占用 128 KB)