Sobes.tech
Junior

Czym są obiekty serializowalne i parcelowalne?

sobes.tech AI

Odpowiedź od AI

Obiekty serializowalne mogą być konwertowane na strumień bajtów do przechowywania lub przesyłania, korzystając z standardowego mechanizmu Java java.io.Serializable.

Obiekty parcelowalne mogą być również pakowane i rozpakowywane, ale używają specjalistycznego mechanizmu Android android.os.Parcelable. Ten mechanizm jest bardziej wydajny do przesyłania danych między komponentami Android, ponieważ jest zoptymalizowany pod kątem IPC (Komunikacji Międzyprocesowej).

Charakterystyka Serializable Parcelable
Mechanizm Refleksja w Java API parcelowania Androida
Wydajność Mniej wydajny (używa refleksji) Bardziej wydajny
Implementacja Prostsza (interfejs markerowy) Wymaga implementacji metod writeToParcel, createFromParcel, describeContents
Użycie Standardowa aplikacja Java, wywołania RMI Specyficzne dla Androida, przesyłanie danych między aktywnościami, usługami itp.
Szablon Mniej kodu Więcej kodu

Przykład implementacji Parcelable:

// MyParcelableObject.java
package com.example.myapplication;

import android.os.Parcel;
import android.os.Parcelable;

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

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

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

    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, jeśli nie ma specjalnych deskryptorów plików
    }

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

    // Gettery (pominięte dla zwięzłości)
}