Android Serializable和Parcelable的区别和用法

来源:互联网 发布:stc52单片机和stc51 编辑:程序博客网 时间:2024/05/04 06:55

有时我们在两个Activity之间传递数据时,传递的数据过多时,这时我门会考虑到传递一个对象过去,来解决这个问题,有两个接口Serializable和Parcelable可以实现对象的传递;既然有两个,那肯定是有区别的?

Serializable接口:Serializable 接口是一种标识接口(marker interface),这意味着无需实现方法,Java便会对这个对象进行高效的序列化操作,但是在内存中开销方面会比较大,效率会过慢。

Parcelable接口:Android的Parcelable的设计初衷是因为Serializable效率过慢,在内存开销方面较小,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。

为了提高程序的性能和效率,google官方推荐大家使用Parcelable接口;接下来看看怎么使用它们吧?

Serializable接口:类只需要实现Serializable接口

import java.io.Serializable;public class Teacher implements Serializable {    private String name;    private int age;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int  age) {        this.age = age;    }    @Override    public String toString() {        return "Teacher{" +                "name='" + name + '\'' +                ", age='" + age + '\'' +                '}';    }}

启动Activity时,使用 intent.putExtra()方法将对象传递过去。

 Teacher teacher=new Teacher(); Intent intent=new Intent(MainActivity.this,Main2Activity.class); teacher.setName("张丹"); teacher.setAge(32); intent.putExtra("teacher",teacher); startActivity(intent);

Main2Activity:

 Intent intent = getIntent(); Teacher teacher = (Teacher) intent.getSerializableExtra("teacher"); Toast.makeText(this, teacher.toString(), Toast.LENGTH_SHORT).show();

Parcelable接口:parcelable需要实现writeToParcel、describeContents函数以及静态的CREATOR变量,实际上就是将如何打包和解包的工作自己来定义,而序列化的这些操作完全由底层实现。

import android.os.Parcel;import android.os.Parcelable;public class Student implements Parcelable {    private String name;    private int age;    public Student() {    }    //解包,读取数据    protected Student(Parcel in) {        name = in.readString();        age = in.readInt();    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    @Override    public String toString() {        return "Student{" +                "name='" + name + '\'' +                ", age=" + age +                '}';    }    @Override    public int describeContents() {        return 0;    }    //将数据打包    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeString(name);        dest.writeInt(age);    }    //对象的创建器,将数据解包    public static final Creator<Student> CREATOR = new Creator<Student>() {        @Override        public Student createFromParcel(Parcel in) {            return new Student(in);        }        @Override        public Student[] newArray(int size) {            return new Student[size];        }    };}

启动Activity时,使用 intent.putExtra()方法将对象传递过去

 Student student=new Student(); Intent intent=new Intent(MainActivity.this,Main3Activity.class); student.setName("李思思"); student.setAge(18); intent.putExtra("student",student); startActivity(intent);

Main3Activity

Intent intent = getIntent();Student student = intent.getParcelableExtra("student");Toast.makeText(this, student.toString(), Toast.LENGTH_SHORT).show();

以上是Serializable和Parcelable的区别和用法,小编的水平有限,如果大家有什么疑问,大家一起讨论,可以加我的qq 1059408192;

转载请注明出处;

0 0
原创粉丝点击