Sobes.tech
Junior

Co jsou serializovatelné a parcelovatelné objekty?

sobes.tech AI

Odpověď od AI

Serializovatelné objekty mohou být převedeny na proud bajtů pro ukládání nebo přenos pomocí standardního mechanismu Java java.io.Serializable.

Parcelovatelné objekty mohou být také zabaleny a rozbaleny, ale používají specializovaný mechanismus Android android.os.Parcelable. Tento mechanismus je efektivnější pro přenos dat mezi komponentami Android, protože je optimalizován pro IPC (meziprocesovou komunikaci).

Charakteristika Serializable Parcelable
Mechanismus Java reflexe Android Parceling API
Výkon Méně efektivní (používá reflexi) Efektivnější
Implementace Jednodušší (marker interface) Vyžaduje implementaci metod writeToParcel, createFromParcel, describeContents
Použití Standardní Java aplikace, RMI volání Specifické pro Android, přenos dat mezi aktivitami, službami atd.
Ukázka Méně kódu Více kódu

Příklad implementace 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; // Обычно 0, если нет специальных файловых дескрипторов
    }

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

    // Геттеры (опущены для краткости)
}