Sobes.tech
Junior

Czym jest serializacja i parsowanie obiektów w Androidzie?

sobes.tech AI

Odpowiedź od AI

Serializacja to proces konwersji obiektu na strumień bajtów do celów przechowywania (np. w pliku lub bazie danych) lub przesyłania (np. przez sieć). Parsowanie (lub deserializacja) to proces odwrotny: przywracanie obiektu ze strumienia bajtów. W Androidzie do tych celów najczęściej używa się Serializable lub Parcelable.

Serializable (standardowy interfejs Java): łatwy w użyciu (wystarczy zaimplementować interfejs), ale wolniejszy niż Parcelable i tworzy dużo tymczasowych obiektów.

// Przykład Serializable
import java.io.Serializable;

public class MySerializableObject implements Serializable {
    private static final long serialVersionUID = 1L; // Zaleca się podanie
    private String name;
    private int age;

    public MySerializableObject(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Gettery i settery
}

Parcelable (interfejs specyficzny dla Androida): szybszy i bardziej wydajny niż Serializable, ponieważ jest zoptymalizowany do IPC (komunikacji międzyprocesowej). Wymaga więcej kodu.

// Przykład Parcelable
import android.os.Parcel;
import android.os.Parcelable;

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

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

    // Konstruktor do deserializacji
    protected MyParcelableObject(Parcel in) {
        name = in.readString();
        age = in.readInt();
    }

    // Creator do tworzenia instancji z Parcel
    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; // Zazwyczaj 0
    }

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

    // Gettery i settery
}

Porównanie:

Funkcja Serializable Parcelable
Interfejs java.io.Serializable android.os.Parcelable
Wydajność Wolniejszy Szybszy
Łatwość użycia Łatwiejszy (mniej kodu) Trudniejszy (więcej kodu)
Zastosowanie Java ogólnie Android (IPC, Bundles, Intents)
Tworzenie obiektów Więcej tymczasowych obiektów Mniej tymczasowych obiektów

Parcelable jest preferowany do przesyłania danych między komponentami Androida (np. przez Intent lub Bundle).