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");
ArrayList
Parcelable オブジェクトは以下のように渡すことができます。
// 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");
結論
Parcelable
Serializable
インターフェースよりも速いParcelable
Serializable
インターフェースはインターフェースに比べて実装に時間がかかりますSerializable
インターフェースの実装が簡単Serializable
インターフェースは多くの一時オブジェクトを作成し、かなりの量のガベージコレクションを引き起こしますParcelable
AndroidではIntent経由で配列を渡すことができる