Sobes.tech
Middle

Jaka jest różnica między Serializable a Parcelable w Android?

sobes.tech AI

Odpowiedź od AI

Główna różnica dotyczy wydajności i sposobu implementacji.

  • Serializable:

    • Standardowy interfejs z Java SE.
    • Łatwiejszy w implementacji (wystarczy zaimplementować interfejs).
    • Używa Java Reflection API do serializacji, co jest wolniejsze i wymaga więcej pamięci.
    • Odpowiedni dla małych obiektów lub gdy wydajność serializacji nie jest krytyczna.
  • Parcelable:

    • Specyficzny interfejs dla Android SDK.
    • Wymaga jawnego opisu procesu serializacji/deserializacji.
    • Znacznie szybszy i bardziej efektywny pod względem użycia pamięci, ponieważ nie opiera się na Reflection.
    • Lepszy wybór do przekazywania obiektów między komponentami Android (Activity, Service, BroadcastReceiver) oraz do zapisywania stanu.

Aby zaimplementować Parcelable, należy:

  1. Zaimplementować interfejs Parcelable.
  2. Zaimplementować metodę writeToParcel() do zapisu danych do Parcel.
  3. Zaimplementować metodę describeContents().
  4. Utworzyć statyczny obiekt CREATOR, który jest implementacją 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);
    }
}

Porównanie:

Cecha Serializable Parcelable
Biblioteka java.io android.os
Wydajność Niska (używa Reflection) Wysoka
Efektywność pamięci Niska Wysoka
Implementacja Prostsza Bardziej skomplikowana
Użycie Java ogólne, małe dane Android, przekazywanie danych między komponentami