บทความนี้อธิบาย ความแตกต่างระหว่าง Parcelable และ Serializable ใน Android
Serializable
Serializable เป็น Marker Interface (หรือเรียกว่า Empty Interface) ไม่มีเมธอดที่ต้อง implement ใดๆ Serializable จะแปลงอ็อบเจกต์เป็น Byte Stream เพื่อส่งข้อมูลระหว่าง Activity ได้ ข้อดีหลักคือ สร้างและส่งข้อมูลง่าย แต่ช้ากว่า Parcelable
ตัวอย่าง Serializable
import java.io.Serializable;
class SerializableObject implements Serializable {
String name;
public SerializableObject(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Parcelable
Parcelable เร็วกว่า Serializable มาก Parcelable แปลงอ็อบเจกต์เป็น Byte Stream และส่งข้อมูลระหว่างสอง Activity การเขียนโค้ด Parcelable ซับซ้อนกว่า Serialization เล็กน้อย แต่ไม่สร้าง Temporary Objects มากนักขณะส่งข้อมูล
ตัวอย่าง Parcelable
import android.os.Parcel;
import android.os.Parcelable;
class ParcelableObject implements Parcelable {
private String name;
protected ParcelableObject(Parcel in) {
this.name = in.readString();
}
public ParcelableObject(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static final Creator<ParcelableObject> CREATOR = new Creator<ParcelableObject>() {
@Override
public ParcelableObject createFromParcel(Parcel in) {
return new ParcelableObject(in);
}
@Override
public ParcelableObject[] newArray(int size) {
return new ParcelableObject[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.name);
}
}
ตารางเปรียบเทียบ
| คุณสมบัติ | Serializable | Parcelable |
|---|---|---|
| ความเร็ว | ช้า (ใช้ Reflection) | เร็ว (Optimized สำหรับ Android) |
| ความซับซ้อนของโค้ด | ง่าย (เพียง implements) | ซับซ้อน (ต้อง implement เมธอดหลายตัว) |
| Temporary Objects | สร้างเยอะ (GC Pressure) | สร้างน้อย |
| ใช้กับ Intent/Bundle | ได้ | ได้ (แนะนำ) |
| รองรับ Versioning | ได้ด้วย serialVersionUID | ต้องจัดการเองใน writeToParcel/readFromParcel |
คำแนะนำ
- ใช้ Parcelable สำหรับการส่งข้อมูลระหว่าง Activity/Fragment ใน Android (Best Practice)
- ใช้ Serializable เมื่อต้องส่งข้อมูลข้าม Process หรือบันทึกลงไฟล์/Database
- ปัจจุบันสามารถใช้ @Parcelize (Kotlin) หรือ Library เช่น AutoParcel เพื่อลด Boilerplate Code