Andorid序列化方式Serizlizable和Parcelable

来源:互联网 发布:mac魔兽争霸3打开黑屏 编辑:程序博客网 时间:2024/06/06 05:30

在开发过程中,有时我们需要对对象进行传输,或者将对象进行持久化存储,这时我们就需要实现对象的序列化。

在Android开发过程中,对象的序列化主要有两种方式:1.实现Serializable接口  2.实现Parcelable接口。下面就对着两种方式进行一一介绍。

1.Serializable接口

Serializable是Java提供的一种序列化借口,可以为对象提供标准的系列化和反序列化操作。因为他是一个空的接口,所以使用起来非常简单,只需要在构建实体类的时候,类实现Serializable接口就可以了。

<span style="white-space:pre"></span>public class Bean implements Serializable{

注意:当我们需要反序列化的时候,最好声明一个serialVersionUID,它是用来辅助序列化和反序列化过程的,被序列化后的数据中的serialVersionUID只有和当前类的serialVersionUID相同才能正常地反序列化。

<span style="white-space:pre"></span>private static final long serialVersionUID=123456789L;
serialVersionUID的工作原理:

对象在序列化的时候,系统会把当前类的serialVersionUID也一起写入序列化的后的结果中,当我们需要反序列化的时候,系统会去检测目标中的serizlVersionUID,看是否与我们在类中申明的UID一致,一致则反序列化成功。否则则说明序列化类不匹配,则失败。
注意:静态成员变量属于类不属于对象,所以不能够序列化。用transient关键字标记的成员变量不参与序列化。

     

2.Parcelable接口

Parcelable也是一个接口,只要类实现了这个接口,就可以实现序列化,并可以通过intent和Binder进行传递。

但是他不同的时有几个接口,下面展示一下它的典型用例。

/** * Created by 2 on 2015/12/25. */public class UserBean implements Parcelable{    private int id;    private String name;    //从序列化后的对象中创建原始对象    protected UserBean(Parcel in) {   //Pancel内部包装了可序列化的数据,可以在Binder中自有传输        id = in.readInt();        name = in.readString();    }    //构造方法    public UserBean(int id, String name) {        this.id = id;        this.name = name;    }    //    public static final Creator<UserBean> CREATOR = new Creator<UserBean>() {        //从序列化后的对象中创建原始对象        @Override        public UserBean createFromParcel(Parcel in) {            return new UserBean(in);        }        //创建指定长度的原始对象数组        @Override        public UserBean[] newArray(int size) {            return new UserBean[size];        }    };    //返回当前对象的内容描述(如果含有内容描述就返回1,否则返回0)    @Override    public int describeContents() {        return 0;    }    //将当前对象写入序列化结构中    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeInt(id);        dest.writeString(name);    }}
在上面的代码中,我们在序列化的过程中,需要实现的有:序列化、反序列化、内容描述

1.序列化:序列化的功能是由writeToParcel方法来完成,最终通过Parcel中的一系列write方法来完成

2.反序列化:由Creator来完成,其内部标注了如何创建序列化对象和数组,并通过Parcel中的read方法来完成反序

列化过程。

3.内容描述:由describeContents方法来完成,当前对象有文件描述时返回1,否则返回0。


3:Parcelable和Serializable的区别。

大家可能会奇怪,这两个接口都能用intent传递数据,而且Parcelable麻烦那么多,为什么还不舍弃呢。

其实:Serializable虽然用起来简单,但是其在序列化和反序列化的过程中,会进行大量的I/O操作,所以开销大,效率低。

而Parcelable是Android特有的序列化方式,虽然用起来麻烦点,但是效率非常高。所以更适合用在Android开发过程中。

所以,当我们需要序列化一些比较大的对象的时候,最好还是选择Parcelable来进行序列化,一些小的对象,

可以通过Serializable来进行序列化,从而减少代码量。



0 0