在日常的应用开发中,我们可能需要让某些物件离开记忆体空间,储存到物理磁碟,以便长期储存,同时也能减少对记忆体的压力,而在需要时再将其从磁碟读取到记忆体,比如将某个特定的物件储存到档案中,隔一段时间后再把它读取到记忆体中使用,那么该物件就需要实现序列化操作,在 Java 中可以使用 Serializable 介面实现物件的序列化,而在 android 中既可以使用 Serializable 介面实现物件序列化也可以使用 Parcelable 介面实现物件序列化,但是在记忆体操作时更倾向于实现 Parcelable 介面,这样会使用传输效率更高效。接下来我们将分别详细地介绍这样两种序列化操作。 了解序列化与反序列 序列化 由于存在于记忆体中的物件都是暂时的,无法长期驻存,为了把物件的状态保持下来,这时需要把物件写入到磁碟或者其他介质中,这个过程就叫做序列化。 反序列化 反序列化恰恰是序列化的反向操作,也就是说,把已存在在磁碟或者其他介质中的物件,反序列化(读取)到记忆体中,以便后续操作,而这个过程就叫做反序列化。 概括性来说序列化是指将物件例项的状态储存到储存媒体(磁碟或者其他介质)的过程。在此过程中,先将物件的公共栏位和私有栏位以及类的名称(包括类所在的程序集)转换为位元组流,然后再把位元组流写入资料流。在随后对物件进行反序列化时,将建立出与原物件完全相同的副本。 实现序列化的必要条件 一个物件要实现序列化操作,该类就必须实现了 Serializable 介面或者 Parcelable 介面,其中 Serializable 介面是在 java 中的序列化抽象类,而 Parcelable 介面则是 android 中特有的序列化介面,在某些情况下,Parcelable 介面实现的序列化更为高效,关于它们的实现案例我们后续会分析,这里只要清楚知道实现序列化操作时必须实现 Serializable 介面或者 Parcelable 介面之一即可。 序列化的应用情景 主要有以下情况(但不限于以下情况) 1)记忆体中的物件写入到硬碟; 2)用套接字在网络上传送物件; 3)通过 RMI(RemoteMethodInvoke 远端方法呼叫)传输物件; Serializable Serializable 是 java 提供的一个序列化介面,它是一个空介面,专门为物件提供标准的序列化和反序列化操作,使用 Serializable 实现类的序列化比较简单,只要在类宣告中实现 Serializable 介面即可,同时强烈建议宣告序列化标识。 Parcelable 鉴于 Serializable 在记忆体序列化上开销比较大,而记忆体资源属于 android 系统中的稀有资源(android 系统分配给每个应用的记忆体开销都是有限的),为此 android 中提供了 Parcelable 介面来实现序列化操作,Parcelable 的效能比 Serializable 好,在记忆体开销方面较小,所以在记忆体间资料传输时推荐使用 Parcelable,如通过 Intent 在 activity 间传输资料,而 Parcelable 的缺点就使用起来比较麻烦。