基于https://www.wanandroid.com每日一问的笔记,做一些整理,方便自己进行查看和记忆。
为什么Parcelable的效率比Serializable高?
可以从设计目的和实现原理两个方面分析
设计目的
- Serializable是Java API,是一个通用的序列化机制,通过将文件保存到本地文件、网络流等实现便数据的传递,这种数据传递不仅可以在单个程序中进行,也可以在两个不同的程序中进行;Parcelable是Android SDK API,为了在同个程序的不同组件之间和不同程序(AIDL)之间高效的传输数据,是通过IBinder通信的消息的载体。从设计目的上可以看出Parcelable就是为了Android高效传输数据而生的。
实现原理
- Serializable是通过I/O读写存储在磁盘上的,使用反射机制,序列化过程较慢,且在序列化过程中创建许多临时对象,容易触发GC。Parcelable是直接在内存中读写的,自已实现封送和解封(marshalled &unmarshalled)操作,将一个完整的对象分解成Intent所支持的数据类型,不需要使用反射,所以Parcelable具有效率高,内存开销小的优点。
Parcelable为了效率损失了什么
- Serializable是通用的序列化机制的,将数据存储在磁盘,可以做到有限持久化保存,文件的生命周期不受程序影响,Parcelable的序列化操作完全由底层实现,不同版本的Android是实现方式可能不相同,所以不能进行持久化存储。
一个对象可以序列化的关键
- 序列化是将一个对象从存储态转化成传输态的过程,把对象转化成字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
- 在序列化时,对象的各属性都必须是可序列化的,声明为static和transient类型的成员数据不能被序列化。
- 并非所有的对象都可以序列化,,至于为什么不可以,有很多原因了,比如:
- 安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行rmi传输等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的。
- 资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分配,而且,也是没有必要这样实现。