一、简介
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。