您的位置:首页 > 移动开发 > Android开发

Android中的序列化Serializable和Parcelable

2017-06-04 13:52 351 查看
一简介

二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时:标识当前对象需要作为返回值返回,不能立即释放资源,几乎所有情况都为0PARCELABLE_WRITE_RETURN_VALUE
describeContents()返回当前对象的内容描述。如果含有文件描述符,返回1,否则返回0,几乎所以情况都是返回0CONTENTS_FILE_DESCRIPTOR
那么Serializable和Parcelable该如何选择呢?

Serializable是Java中的序列化接口,使用起来简单但是开销很大,序列化和反序列化过程需要大量的I/O操作;

Parcelable是Android中的序列化方式,因此更适用与Android平台上,缺点就是使用起来比较麻烦,但是效率很高。

Parcelable主要用在内存序列化上;如果要将对象序列化到 存储设备 中或者 通过网络传输 建议使用Serializable。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息