Android之序列化浅析

序列化是什么

序列化是指把Java对象转换为字节序列并存储到一个存储媒介的过程。反之,把字节序列恢复为Java对象的过程则称之为反序列化。 android

为何要序列化

Java对象存在的一个前提是JVM有在运行,所以,若是JVM没有运行或者在其余机器的JVM上是不可能获取到指定的Java对象的。而序列化操做则是把Java对象信息保存到存储媒介,能够在以上不可能的状况下仍然可使用Java对象。
因此,序列化的主要做用是:数据库

  • 永久性保存对象,保存对象的字节序列到本地文件中;
  • 经过序列化对象在网络中传递对象;
  • 经过序列化在进程间传递对象。

Android中序列化

在Android开发中,常常须要在多个部件(Activity、Fragment或Service)之间经过Intent传递一些数据,若是是一些普通类型的数据能够经过PutExtra()进行传递,若是是对象的话就得先进行序列化才能传递了。在Android中有两种序列化的接口,Serializable和Parcelable。网络

  • Serializable:(JavaSE自己就支持的)保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输。
  • Parcelable:(Android特有功能)由于Serializable效率过慢,为了在程序内不一样组件间以及不一样Android程序间(AIDL)高效
    的传输数据而设计,这些数据仅在内存中存在。

什么时候使用它们

Parcelable的效率会比Serializable高,数据仅存在于内存中。;而Serializable由于使用到了反射,会相对慢一些,所以,只在内存间传递数据的话推荐用Parcelable,而若是是要进行保存或者网络传输则选择Serializable。ide

Serializable接口的实现

只须要实现Serializable接口,并提供一个序列化版本id(serialVersionUID)便可。this

public class DataBean implements Serializable{
    ...
}

Parcelable接口的使用

Parcelable实现方式略复杂一些,需重写describeContents和writeToParcel这两个方法提供一个名为CREATOR常量。实际上就是将如何打包和解包的工做本身来定义,
而序列化的这些操做彻底由底层实现。设计

public class DataBean implements Parcelable{
    private int id;
    private String name;
    private String Account;
    private int kind;
    private String password;
    private String desc;

    public DataBean(){}
    // 用来建立自定义的Parcelable的对象
    public static final Creator<DataBean> CREATOR = new Creator<DataBean>() {
        @Override
        public DataBean createFromParcel(Parcel in) {
            return new DataBean(in);
        }

        @Override
        public DataBean[] newArray(int size) {
            return new DataBean[size];
        }
    };

   //GET SET方法
   ...

    @Override
    public String toString() {
        return "DataBean{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", Account='" + Account + '\'' +
                ", kind=" + kind +
                ", password='" + password + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }

    @Override
    public int describeContents() {
        return 0;
    }
    // 写数据进行保存
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(this.id);
        dest.writeString(this.Account);
        dest.writeString(this.name);
        dest.writeString(this.password);
        dest.writeInt(this.kind);
        dest.writeString(this.desc);
    }
    // 读数据进行恢复
    protected DataBean(Parcel in) {
        this.id = in.readInt();
        this.kind = in.readInt();
        this.password = in.readString();
        this.name = in.readString();
        this.Account = in.readString();
        this.desc = in.readString();
    }
}

这样就完成了对DataBean的序列化,使用的时候就能够经过Intent进行传递了。code

//Activity传递对象,无论是实现哪一个接口都是用以下方式传递
intent.putExtra("data",data);

//在另外一个Activity中接收对象的方式分别是:
DataBean data = getIntent().getSerializableExtra("data");
DataBean data = getIntent().getParcelableExtra("data");

Android中序列化的使用大体就是这样了。对象

更多文章也可关注个人静态博客,更新相对会优先些传送门接口

相关文章
相关标签/搜索