1.Android中实现序列化有两个选择:
一是实现Serializable接口(是JavaSE本身支持的),另外一种是实现Parcelable接口(效率比Serializable高,是Android特有的,用于Intent传递数据,也可用于进程间通信)。
2.那么为什么需要序列化呀?
a)Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的.例如Intent需要传递一个对象,就用Bundle .putSerializable(Key,Object)。前提是你这个对象implement了Serailizable。
b)Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。例如Intent需要传递一个对象,就用Bundle .putParcelable(Key,Object)。前提是你这个对象implement了Parcelable。
3.两者对比:
1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。
2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3)Parcelable不能使用在要将数据存储在磁盘上或网络传输数据的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化尽管Serializable效率低点,但此时还是建议使用Serializable 。
4.代码实现
实现Serializable接口非常简单,只需要implements Serializable就可以了,有些变量如果不需要序列化的话就加上transient声明。
实现Parcelable接口略微有趣一些:
先看看Parcelable接口定义:
再介绍一下Parcel吧:
意思大概是Parcel是一个在序列化过程中的容器,可以write进去,然后read出来,看不懂的妹子可以打电话或者微信视频我。
实现Parcelable步骤:
1.在WriteToParcel方法中写入自己需要的变量
2.创建私有的构造方法,按顺序,按顺序,按顺序,把变量读出来
实例化静态内部对象CREATOR实现接口Parcelable.Creator
注:其中public static final一个都不能少,内部对象CREATOR的名称也不能改变,必须全部大写。需重写本接口中的两个方法:createFromParcel(Parcel in) 实现从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层,newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话即可(return new T[size]),供外部类反序列化本类数组使用。