Android 中Serializable与Parcelable区别

两种都是用于支持序列化、反序列化话操作,两者最大的区别在于存储媒介的不同,Serializable使用IO读写存储在硬盘上,而Parcelable是直接在内存中读写,很明显内存的读写速度通常大于IO读写,所以在Android中通常优先选择Parcelable。

先说下Serializable:
Serializable基于反射来做的,再序列化的过程中会创建很多临时对象,容易触发垃圾回收。
Serializable基于磁盘或者网络进行序列化。
好处是我只需要继承自Serializable接口即好,特别简单。
在默认情况下序列化速度肯定会比Parcelable慢(但是如果绕开反射自己实现对象的IO流读取,速度会不一样)

Parcelable:
Parcelable需要用户自己实现对象的序列化与反序列化模版。
Parcelable基于内存进行序列化,简单来说Parcel提供了一套机制,可以将序列化之后的数据写入到kernel的共享内存中,其他进程通过Parcel可以从这块共享内存中读出字节流,并反序列化成对象。
如果在追求高效率的情况下使用Parcelable。
不建议拿这个对象做持久化存储,因为Parcelable对类数据信息验证不准确,只要类名称不变,即使类完全发生变化,Parcelable也可以做反序列化操作。

Parcelable有以下几个特点

  1. 整个读写全是在内存中进行,主要是通过malloc()、realloc()、memcpy()等内存操作进行,所以效率比JAVA序列化中使用外部存储器会高很多。
  2. 读写时是4字节对齐的,可以看到#define PAD_SIZE(s) (((s)+3)&~3)这句宏定义就是在做这件事情。
  3. 如果预分配的空间不够时newSize = ((mDataSize+len)*3)/2;会一次多分配50%。
  4. 对于普通数据,使用的是mData内存地址,对于IBinder类型的数据以及FileDescriptor使用的是mObjects内存地址。后者是通过flatten_binder()和unflatten_binder()实现的,目的是反序列化时读出的对象就是原对象而不用重新new一个新对象。

一般Android中对象序列化除了以上两种方式还有
SQLiteDatabase SharePreference Json
这两个开源框架也能实现序列化: Protocol Buffers , FlatBuffers

参考文章:
http://www.2cto.com/kf/201403/288476.html
http://www.jianshu.com/p/fcc59fb523b6

更多相关文章

  1. ContentProvider详解
  2. Android(安卓)button 性能探讨
  3. android之Intent基本使用
  4. android 应用程序Activity之间数据传递与共享的几种途径
  5. Android中自动朗读(TTS)的简单使用
  6. 深入理解Android音频框架AudioTrack到AudioFlinger及Mix过程
  7. Android中Window的管理深入讲解
  8. 客户端微信分享
  9. Android中的文件存储数据方式

随机推荐

  1. Android(安卓)DOM解析xml
  2. android 制作.9.png图片
  3. Android(安卓)VS iPad
  4. 谷歌评选出第二届Android开发者竞赛获胜
  5. Android(安卓)spinner取值
  6. android app的启动优化方法
  7. android開發---周總結2
  8. Android(安卓)TextView--项目开发少不了
  9. Android在专利战中败北后会发生什么?
  10. 关于Linux Kernel and Android(安卓)休眠