Android中的序列化Serializable和Parcelable

一、简介

IPC是Inter-Process Communication的缩写,含义为进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程;
IPC主要包含三个方面:Serializable接口、Parcelable接口和Binder;
Android中可Serializable接口和Parcelable接口来对对象进行序列化;

二、Serializable接口

Serializable是java提供的一个序列化接口,他是一个空接口,为对象提供标准的序列化和反序列化操作。Serializable使用很简单,只需该类实现Serializable接口,并声明一个serialVersionUID。如下所示:

public class User implements Serializable {
    private static final long serialVersionUID = 7382351359868556980L;
    private String name;
    private int age;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

其中serialVersionUID并不是必要的,不声明serialVersionUID也可以实现序列化,但是会对反序列化造成影响;
把对象转换为字节序列的过程称为对象的序列化把字节序列恢复为对象的过程称为对象的反序列化
数据传递如下:

Intent intent = new Intent(this,MainActivity.class);
        User user = new User();
        user.setName("wzc");
        user.setAge(22);
        intent.putExtra("wzc",user);
        startActivity(intent);

三、Parcelable接口

Parcelable也是个接口,实现这个接口需要
1、复写describeContents()方法和writeToParcel() 方法;
2、实例化静态内部对象CREATOR,实现接口Parcelable.Creator<T> 。
所以一个类实现Parcelable接口最初是这样的:

public class User implements Parcelable{
    protected User(Parcel in) {
    }

    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel in) {
            return new User(in);
        }

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

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
    }
}

我们要做的就是写己需要的构造方法,写一下私有变量的get和set。如下所示:

package com.wzc.demo.user;

import android.os.Parcel;
import android.os.Parcelable;
/**
 * Created by Wzc on 2017/6/4 0004.
 */
public class User implements Parcelable{

    private String name;
    private int age;
    private String sex;
    public User(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel in) {
            return new User(in);
        }

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

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
        dest.writeString(sex);
    }

    protected User(Parcel in) {
        name = in.readString();
        age = in.readInt();
        sex = in.readString();
    }
}

注意:writeToParcel()方法中write的顺序要和User(Parcel in)中read的顺序一致。

方法 功能 标记位
createFromParcel(Parcel in) 从序列化后的对象中创建原始对象
newArray(int size) 创建指定长度的原始对象数组
User(Parcel in) 从序列化后的对象中创建原始对象
writeToParcel(Parcel dest, int flags) 将当前对象写入序列化结构中,其中flags标识有两种值0或1;为1时:标识当前对象需要作为返回值返回,不能立即释放资源,几乎所有情况都为0 PARCELABLE_WRITE_RETURN_VALUE
describeContents() 返回当前对象的内容描述。如果含有文件描述符,返回1,否则返回0,几乎所以情况都是返回0 CONTENTS_FILE_DESCRIPTOR

那么Serializable和Parcelable该如何选择呢?

  • Serializable是Java中的序列化接口,使用起来简单但是开销很大,序列化和反序列化过程需要大量的I/O操作;
  • Parcelable是Android中的序列化方式,因此更适用与Android平台上,缺点就是使用起来比较麻烦,但是效率很高。
    Parcelable主要用在内存序列化上;如果要将对象序列化到 存储设备 中或者 通过网络传输 建议使用Serializable。
发布了27 篇原创文章 · 获赞 187 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/Mr_wzc/article/details/57080552