Android Serializable和Parcelable的區別和用法

有時我們在兩個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;

轉載請註明出處;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章