Android开发艺术探索笔记(5)- Serializable和Parcelable

来源:互联网 发布:两人换脸的相机软件 编辑:程序博客网 时间:2024/05/18 03:37

因为IPC机制中使用到可序列化,所以理解这两个接口也很重要。

(1)Serializable

这个接口是Java提供的可序列化的接口,而且是一个空的接口。空接口,不可思议吧。刚开始我也蒙了。如果我们用Eclipse或者Android Stdio来开发的话,当我们实现Serializable接口的时候,会提示我们添加一个serialVersionUID这么一个变量。有什么用呢?

书中解释说:我们序列化对象时,还有一个hash值一起写到文件(或者其他中介)中,当我们反序列化的时,系统会先判断实现序列化类的hash值是否与文件(或其他中介)中一致,如果不一致,程序就会crash。

1)如果我们指定了serialVersionUID,serialVersionUID就是这个hash值,写入文件中。当我们反序列化时,即使类结构多加了一些变量,因为serialVersionUID相同,所以会尽量恢复类中变量的值。但是如果你把类改的面目全非,那当然反序列化的时候会失败。

2)如果我们不指定serialVersionUID的值,系统序列化时,会将每个变量的hash值相加然后写入文件(或其他中介),让我们有一点修改,反序列化过程就会失败,程序crash。

以上就是我们定义和不定义serialVersionUID这个变量的区别。书中还说了,我们定义的serialVersionUID是1还是编辑器帮我们生成的数字,效果都是一样的。

(2)Parcelable

Parcelable是一个Android提供的用于序列化的接口,相对于Serializable接口要复杂。里面要实现几个方法,如果用Eclipse或者Android Stdio工具开发的话,会自动提醒。我们要知道的是,了解这几个方法的作用。书中已经给出来,我附上一张图。(其实是自己懒得去记^_^)

这里写图片描述

既然Serializable和Parcelable都可以用于序列化,那我们应该怎么选择?作者在这个问题上,也做了一个说明。

Serializable使用简单,但是开销大,要频繁的使用IO操作。Parcelable实现虽然麻烦,但是效率比较高。书中建议我们如果将对象序列化到储存设备或者序列化之后需要网络传输的,应该使用Serializable。因为Parcelable是内存序列化,所以在以上2种情况会比较繁琐。

0 0