Android Serializable与Parcelable

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

你可能感兴趣的:(Android Serializable与Parcelable)