基于https://www.wanandroid.com每日一问的笔记,做一些整理,方便自己进行查看和记忆。

原文链接:https://www.wanandroid.com/wenda/show/9002

为什么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类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分配,而且,也是没有必要这样实现。