Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

ความแตกต่างระหว่าง Parcelable และ Serializable ใน Android

บทความนี้อธิบาย ความแตกต่างระหว่าง 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