淺談Serializable與Parcelable

Android中使用Intent來啓動Android的組件,而且在啓動Android中的組件的時候可以使用Intent攜帶並傳遞數據。如:

       Intent intent=new Intent(MainActivity.this,AnotherActivity.class);
        intent.putExtra("per_age",20);
        startActivity(intent);

但是當使用Intent的putExtra()方法來傳遞數據的時候,只能傳遞基本類型的數據,無法傳遞對象類型的數據。爲了保證Intent可以傳遞對象類型的數據我們可以採取兩種方式,實體類實現Serializable接口和實體類實現Parcelable接口。
Serializable方式:
Serializable方式指的是序列化方式,而 Java的對象序列化是指將那些實現了Serializable接口的對象轉換成一個字符序列,並能夠在以後將這個字節序列完全恢復爲原來的對象。
Serializable是一個聲明式的接口,沒有任何需要實現的抽象方法,因此當需要將對象序列化的時候,只需要實體類簡單的實現一下接口就行。

/**
 * Created by BeautifulSoup on 2017/2/9.
 */

public class Person implements Serializable{
    private String name;
    private Integer age;

    public Person() {
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

實際操作:

        Person person=new Person("BeautifulSoup",20);
        Intent intent=new Intent(MainActivity.this,AnotherActivity.class);
        intent.putExtra("per",person);
        startActivity(intent);

在目標Activity中得到傳遞的數據:

Person person=(Person)getIntent().getParcelableExtra("per");

此種方式十分簡單,但是效率不高,因此實際操作中我們通常使用Parcelable方式。

Parcelable方式:
Parcelable方式的原理是將一個完整的對象進行分解,從而將完整的對象分解成intent可以傳遞的基本類型的數據。
基本使用的方式就是實體類實現Parcelable接口,重寫接口未實現的方法。
其中describeContents方法的返回值一般是0,writeToParcel方法中將對象中的數據寫出。
此外,我們還需要在實體類中提供一個CREATOR的常量。在匿名類中將寫出的字段依次的讀入即可。

/**
 * Created by BeautifulSoup on 2017/2/9.
 */
public class User implements Parcelable {

    private String name;
    private Integer age;
    private String address;
    private String phone;

    protected User() {
    }

    public User(String name, Integer age, String address, String phone) {
        this.name = name;
        this.age = age;
        this.address = address;
        this.phone = phone;
    }

    //省略getter與setter...

    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel in) {
            User user=new User();
            user.name=in.readString();
            user.age=in.readInt();
            user.address=in.readString();
            user.phone=in.readString();
            return user;
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };

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

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(name);
        parcel.writeInt(age.intValue());
        parcel.writeString(address);
        parcel.writeString(phone);
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                ", phone='" + phone + '\'' +
                '}';
    }
}
        User user=new User("BeautifulSoup",20,"山東","17811111111");
        Intent intent=new Intent(MainActivity.this,AnotherActivity.class);
        intent.putExtra("user",user);
        startActivity(intent);

在目標Activity中得到傳遞的數據:

User user=(User)getIntent().getParcelableExtra("user");
發佈了123 篇原創文章 · 獲贊 47 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章