Sobes.tech
Middle

Ποια είναι η διαφορά μεταξύ Serializable και Parcelable στο Android;

sobes.tech AI

Απάντηση από AI

Η βασική διαφορά βρίσκεται στην απόδοση και τον τρόπο υλοποίησης.

  • Serializable:

    • Πρότυπη διεπαφή από το Java SE.
    • Πιο απλό στην υλοποίηση (απλώς υλοποιείτε τη διεπαφή).
    • Χρησιμοποιεί το Java Reflection API για σειριοποίηση, το οποίο είναι πιο αργό και απαιτεί περισσότερο μνήμη.
    • Κατάλληλο για μικρά αντικείμενα ή όταν η απόδοση σειριοποίησης δεν είναι κρίσιμη.
  • Parcelable:

    • Ειδική διεπαφή για το Android SDK.
    • Απαιτεί ρητή περιγραφή της διαδικασίας σειριοποίησης/αποσειριοποίησης.
    • Πολύ πιο γρήγορο και αποδοτικό σε χρήση μνήμης, καθώς δεν βασίζεται στο Reflection.
    • Η καλύτερη επιλογή για τη μεταφορά αντικειμένων μεταξύ των συστατικών του Android (Activity, Service, BroadcastReceiver) και για την αποθήκευση κατάστασης.

Για την υλοποίηση του Parcelable:

  1. Υλοποιήστε τη διεπαφή Parcelable.
  2. Υλοποιήστε τη μέθοδο writeToParcel() για την εγγραφή δεδομένων στο Parcel.
  3. Υλοποιήστε τη μέθοδο describeContents().
  4. Δημιουργήστε ένα στατικό αντικείμενο CREATOR, το οποίο είναι μια υλοποίηση της διεπαφής Parcelable.Creator.
import android.os.Parcel;
import android.os.Parcelable;

public class MyParcelableObject implements Parcelable {
    private int value;
    private String name;

    public MyParcelableObject(int value, String name) {
        this.value = value;
        this.name = name;
    }

    protected MyParcelableObject(Parcel in) {
        value = in.readInt();
        name = in.readString();
    }

    public static final Creator<MyParcelableObject> CREATOR = new Creator<MyParcelableObject>() {
        @Override
        public MyParcelableObject createFromParcel(Parcel in) {
            return new MyParcelableObject(in);
        }

        @Override
        public MyParcelableObject[] newArray(int size) {
            return new MyParcelableObject[size];
        }
    };

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

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

Πίνακας σύγκρισης:

Χαρακτηριστικό Serializable Parcelable
Βιβλιοθήκη java.io android.os
Απόδοση Χαμηλή (χρησιμοποιεί Reflection) Υψηλή
Αποτελεσματικότητα μνήμης Χαμηλή Υψηλή
Υλοποίηση Πιο απλή Πιο πολύπλοκη
Χρήση Γενική Java, μικρά δεδομένα Android, μεταφορά δεδομένων μεταξύ συστατικών