1. 程式人生 > >小白秒懂系列之 Parcelable 和 Serializable 的 使用 以及他們的 區別

小白秒懂系列之 Parcelable 和 Serializable 的 使用 以及他們的 區別

對這兩個單詞我想都不陌生吧,都知道是用來序列化的,可是為什麼要序列化呢?

  • 永久性儲存 物件,儲存物件的位元組序列到本地檔案;
  • 序列化的物件可以在網路中傳遞;
  • 序列化的物件可以在程序間傳遞。

那麼我們知道它的用處了,可是如何選擇呢?(Parcelable簡稱P,Serializable簡稱S)

  • 在使用記憶體時,P比S效能高所以使用P;
  • S在序列化的時候會產生大量的臨時檔案,從而引起頻繁的GC;
  • P不能使用將物件儲存在磁碟上的情況, 因為P不能很好的保證資料的持續性在外界有變化的情況下,儘管S效率低也要用S。

接下來看看怎麼用:

1、建立實現Serializable的物件

import
java.io.Serializable; /** * Created by ws on 2018/8/31. * Serializable 序列化方式 */ public class Person implements Serializable{ private String name; private int age; public Person(String name, int age) { this.name = name; this.age = 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 "Person{" + "name='"
+ name + '\'' + ", age=" + age + '}'; } }

2、建立實現Parcelable介面的物件

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

/**
 * Created by ws on 2018/8/31.
 * 程式碼都可以根據提示直接生成,除了構造方法protected Student(Parcel in)和writeToParcel方法中的程式碼要自己手寫
 * 注意這裡面的順序,寫的和讀的順序要一直
 */

public class Student implements Parcelable {

    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //注意讀的順序和寫入的順序相同
    protected Student(Parcel in) {
        name = in.readString();
        age = in.readInt();
    }

    //必須是public static final修飾的
    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];
        }
    };

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

    //寫的順序和讀的順序相同
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(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 "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

3、模擬一下頁面跳轉傳物件

第一個介面就是有兩個button模擬兩種模式的傳值

import android.content.Intent;
import android.os.Parcel;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import com.example.a_0102.mylearn.R;

/**
 * 兩種傳遞物件的方式
 * 1、Serializable
 * 2、Parcelable
 *
 * 序列化的作用
 *  - 永久性儲存物件,儲存物件的位元組序列到本地檔案;
 *  - 序列化的物件可以在網路中傳遞;
 *  - 序列化的物件可以在程序間傳遞。
 * 區別
 *  - 在使用記憶體時,P比S效能高所以使用P;
 *  - S在序列化的時候會產生大量的臨時檔案,從而引起頻繁的GC;
 *  - P不能使用將物件儲存在磁碟上的情況, 因為P不能很好的保證資料的持續性在外界有變化的情況下,儘管S效率低也要用S。
 */
public class ParcelActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_parcel);
    }

    public void serialize(View view) {
        Intent intent = new Intent(this, GetDataActivity.class);
        intent.putExtra("serializable", new Person("張三", 20));
        startActivity(intent);
    }

    public void parcel(View view) {
        Intent intent = new Intent(this, GetDataActivity.class);
        intent.putExtra("parcelable", new Student("哈哈", 23));
        startActivity(intent);
    }
}

第二個介面就是用來顯示接收到的資料

import android.os.Parcelable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import com.example.a_0102.mylearn.R;

import java.io.Serializable;

public class GetDataActivity extends AppCompatActivity {

    private TextView mTvShowDataView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_get_data);
        mTvShowDataView = findViewById(R.id.tv_show_data);
        Serializable serializable = getIntent().getSerializableExtra("serializable");
        if(serializable!=null){
           Person pserson = (Person) serializable;
           mTvShowDataView.setText(pserson.toString());
        }
        Parcelable parcelable = getIntent().getParcelableExtra("parcelable");
        if(parcelable!=null){
            Student student = (Student) parcelable;
            mTvShowDataView.setText(student.toString());
        }
    }
}

介面就不貼上了,第一個介面是兩個button,第二個介面是一個TextView