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, пренос на данни между компоненти