Android Parcelable vs Serializable

原创 2015年07月09日 15:04:12

序列化

在Android中,对象在实现序列化之前是无法直接作为Intent参数在Activity之间传递的。
Android中对象序列化可以通过实现Serializable接口或者实现Parcelable接口。接下来,我会介绍一下实现这两个接口的方法以及如何在这两者之间进行选择。


Serializable

Serializable是一个标记接口,意味着它没有需要实现的方法。因为对象再实现Serializable接口的时候,只需要简单的implements即可。

示例代码如下:

package com.example.photocrop.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class PersonSerializable implements Serializable {
    private static final long serialVersionUID = -1535959029658501338L;
    private String name;
    private String sex;
    private int age;
    private List<String> skills = new ArrayList<String>();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List<String> getSkills() {
        return skills;
    }

    public void setSkills(List<String> skills) {
        this.skills = skills;
    }

}

在Activity-1中传递PersonSerializable的代码如下:

    private PersonSerializable generatePerson() {
        PersonSerializable ps = new PersonSerializable();
        ps.setAge(27);
        ps.setName("wangzhengyi");
        ps.setSex("boy");
        ps.setSkills(new ArrayList<String>(Arrays.asList("c", "c++", "java", "php")));

        return ps;
    }

    private void startActivity2() {
        PersonSerializable ps = generatePerson();
        Intent intent = new Intent(this, Activity2.class);
        intent.putExtra("person", ps);
        startActivity(intent);
    }

在activity-2中接收PersonSerializable对象:

Intent intent = getIntent();
PersonSerializable ps  = (PersonSerializable)intent.getSerializableExtra("person");
Log.e("wangzhengyi", "person name :" + ps.getName());
Log.e("wangzhengyi", "persion age :" + ps.getAge());

Parcelable

实现Parcelable接口主要需要如下几个步骤:

  1. 实现describeContents方法。内容接口描述,默认返回0即可。
  2. 实现writeToParcel方法。传递数据到Parcel容器中。
  3. 创建一个Parcelable.Creator接口的实例,用于读取Parcel容器中的数据。

示例代码如下:

package com.example.photocrop.model;

import java.util.ArrayList;
import java.util.List;

import android.os.Parcel;
import android.os.Parcelable;

public class PersonParcelable implements Parcelable{
    private String name;
    private String sex;
    private int age;
    private List<String> skills = new ArrayList<String>();


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List<String> getSkills() {
        return skills;
    }

    public void setSkills(List<String> skills) {
        this.skills = skills;
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(getName());
        dest.writeString(getSex());
        dest.writeInt(getAge());
        dest.writeList(getSkills());
    }

    public void readFromParcel(Parcel source) {
        setName(source.readString());
        setSex(source.readString());
        setAge(source.readInt());
        source.readList(skills, List.class.getClassLoader());
    }

    public static final Parcelable.Creator<PersonParcelable> CREATOR = new Parcelable.Creator<PersonParcelable>() {

        @Override
        public PersonParcelable createFromParcel(Parcel source) {
            // 从Parcel容器中读取传递数据值,封装成Parcelable对象返回逻辑层。
            PersonParcelable pp = new PersonParcelable();
            pp.readFromParcel(source);
            return pp;
        }

        @Override
        public PersonParcelable[] newArray(int size) {
            // 创建一个类型为T,长度为size的数组,仅一句话(return new T[size])即可。方法是供外部类反序列化本类数组使用。
            return new PersonParcelable[size];
        }
    };
}

在activity-1中传递PersonParcelable对象:

    private PersonParcelable generatePerson() {
        PersonParcelable pp = new PersonParcelable();
        ps.setAge(27);
        ps.setName("wangzhengyi");
        ps.setSex("boy");
        ps.setSkills(new ArrayList<String>(Arrays.asList("c", "c++", "java", "php")));

        return pp;
    }

    private void startActivity2() {
        PersonParcelable pp = generatePerson();
        Intent intent = new Intent(this, Activity2.class);
        intent.putExtra("person", ps);
        startActivity(intent);
    }

在activity-2中接收PersonParcelable对象:

        Intent intent = getIntent();
        PersonParcelable pp = (PersonParcelable) intent.getParcelableExtra("person");
        Log.e("wangzhengyi", "person name :" + pp.getName());
        Log.e("wangzhengyi", "persion age :" + pp.getAge());
        for (String skill : pp.getSkills()) {
            Log.e("wangzhengyi", "skill:" + skill);
        }

区别

主要的区别如下:

  1. Serializable实现简单,不需要任何额外的序列化操作。而Parcelable实现较为复杂,有特定的接口和对象句柄需要实现。
  2. Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC,而相比之下Parcelable的性能更高(号称10倍优于Serializable),所以当在使用内存时(如:序列化对象在网络中传递对象或序列化在进程间传递对象),更推荐使用Parcelable接口。
  3. Parcelable有个明显的缺点:不能使用在要将数据存储在磁盘上的情况(如:永久性保存对象,保存对象的字节序列到本地文件中),因为Parcel本质上为了更好的实现对象在IPC间传递,并不是一个通用的序列化机制,当改变任何Parcel中数据的底层实现都可能导致之前的数据不可读取,所以此时还是建议使用Serializable 。
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android 序列化 Parcelable VS Serializable

Android 的序列化方式 ParcelableParcel 介绍:Parcel 内部包装了可序列化的数据,可以在 Binder 中自由传输Parcelable 是一个接口,只要实现这个接口,一个类...
  • CoderR
  • CoderR
  • 2017年07月21日 17:31
  • 230

Android:Parcelable和Serializable的区别

本文主要介绍Parcelable和Serializable的作用、效率、区别及选择。关于Serializable的介绍见Java序列化的高级认识。 1、作用 Serializable的作用是为...
  • wb1456
  • wb1456
  • 2013年04月12日 16:19
  • 397

Android对象序列化:Serializable和Parcelable

Android通过Intent传递对象,或者将对象持久化到文件和进行网络传输时,对象需要实现序列化接口Serializable或者Parcelable。...
  • liu_312
  • liu_312
  • 2017年07月07日 13:22
  • 96

Android -- 序列化Parcelable与Serializable区别及用法

小序继上一篇博客,http://blog.csdn.net/gaopeng0071/article/details/45043967说到的对象传递,对象类实现了Serializable接口。 Ser...

Android——Serializable & Parcelable

Serializable & Parcelable这两种序列化方法是Android中经常使用的方法,Serializable是Android从Java中继承过来的,Parcelable是Android...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android Parcelable vs Serializable
举报原因:
原因补充:

(最多只允许输入30个字)