Android: Parcelable と Serializable の違いは? 質問する

Android: Parcelable と Serializable の違いは? 質問する

Android がオブジェクトをシリアル化するためのインターフェースを 2 つ提供するのはなぜですか? Serializable オブジェクトは AndroidBinderおよび AIDL ファイルと相互運用できますか?

ベストアンサー1

Android では、オブジェクトをアクティビティに渡すだけでは不十分です。これを行うには、オブジェクトが実装SerializableまたはParcelableインターフェースされている必要があります。

シリアル化可能

Serializableは標準の Java インターフェースです。クラスにインターフェースをマークするだけですSerializable。このアプローチの問題は、リフレクションが使用され、処理が遅いことです。このメソッドは多くの一時オブジェクトを作成し、かなりの量のガベージ コレクションを引き起こします。ただし、Serializableインターフェースは実装が簡単です。

以下の例を見てください (Serializable):

// MyObjects Serializable class

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

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

public class MyObjects implements Serializable {

    private String name;
    private int age;
    public ArrayList<String> address;

    public MyObjects(String name, int age, ArrayList<String> address) {
        super();
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public ArrayList<String> getAddress() {
        if (!(address == null))
            return address;
        else
            return new ArrayList<String>();
    }

    public String getName() {
        return name;
    }

    // return age
    public int getAge() {
        return age;
    }
}
// MyObjects instance
MyObjects mObjects = new MyObjects("name", "age", "Address array here");

// Passing MyObjects instance via intent
Intent mIntent = new Intent(FromActivity.this, ToActivity.class);
mIntent.putExtra("UniqueKey", mObjects);
startActivity(mIntent);
// Getting MyObjects instance
Intent mIntent = getIntent();
MyObjects workorder = (MyObjects)    mIntent.getSerializableExtra("UniqueKey");

区画可能

Parcelableプロセスは よりもはるかに高速ですSerializable。その理由の 1 つは、シリアル化プロセスを推測するためにリフレクションを使用するのではなく、明示的にシリアル化プロセスを使用していることです。また、コードがこの目的のために大幅に最適化されていることも当然です。

以下の例 (Parcelable) をご覧ください。

// MyObjects Parcelable class

import java.util.ArrayList;

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

public class MyObjects implements Parcelable {

    private int age;
    private String name;
    private ArrayList<String> address;

    public MyObjects(String name, int age, ArrayList<String> address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public MyObjects(Parcel source) {
        age = source.readInt();
        name = source.readString();
        address = source.createStringArrayList();
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(age);
        dest.writeString(name);
        dest.writeStringList(address);
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public ArrayList<String> getAddress() {
        if (!(address == null))
            return address;
        else
            return new ArrayList<String>();
    }

    public static final Creator<MyObjects> CREATOR = new Creator<MyObjects>() {
        @Override
        public MyObjects[] newArray(int size) {
            return new MyObjects[size];
        }

        @Override
        public MyObjects createFromParcel(Parcel source) {
            return new MyObjects(source);
        }
    };
}
// MyObjects instance
MyObjects mObjects = new MyObjects("name", "age", "Address array here");

// Passing MyOjects instance
Intent mIntent = new Intent(FromActivity.this, ToActivity.class);
mIntent.putExtra("UniqueKey", mObjects);
startActivity(mIntent);
// Getting MyObjects instance
Intent mIntent = getIntent();
MyObjects workorder = (MyObjects) mIntent.getParcelableExtra("UniqueKey");

ArrayListParcelable オブジェクトは以下のように渡すことができます。

// Array of MyObjects
ArrayList<MyObjects> mUsers;

// Passing MyOjects instance
Intent mIntent = new Intent(FromActivity.this, ToActivity.class);
mIntent.putParcelableArrayListExtra("UniqueKey", mUsers);
startActivity(mIntent);
// Getting MyObjects instance
Intent mIntent = getIntent();
ArrayList<MyObjects> mUsers = mIntent.getParcelableArrayList("UniqueKey");

結論

  1. ParcelableSerializableインターフェースよりも速い
  2. ParcelableSerializableインターフェースはインターフェースに比べて実装に時間がかかります
  3. Serializableインターフェースの実装が簡単
  4. Serializableインターフェースは多くの一時オブジェクトを作成し、かなりの量のガベージコレクションを引き起こします
  5. ParcelableAndroidではIntent経由で配列を渡すことができる

おすすめ記事