Sobes.tech
Junior

Šta su serializabilni i parcelabilni objekti?

sobes.tech АИ

Одговор од АИ

Објекти који се могу серијализовати могу бити претворени у бајт поток за чување или пренос, користећи стандардни механизам Јаве java.io.Serializable.

Објекти који се могу парселизовати такође могу бити упаковани и распаковани, али користе специјализовани механизам Андроид android.os.Parcelable. Овај механизам је ефикаснији за пренос података између компоненти Андроида, јер је оптимизован за IPC (интер-процес комуникацију).

Карактеристика Serializable Parcelable
Механизам Јава рефлексија Андроид Parceling API
Перформансе Мање ефикасно (користи рефлексију) Ефикасније
Реализација Једноставније (маркерски интерфејс) Захтева реализовање метода writeToParcel, createFromParcel, describeContents
Користи се Стандардна Јава апликација, удаљени позиви метода (RMI) Специфично за Андроид, пренос података између активити, сервиса итд.
Бојлерплејт Мање кода Више кода

Пример реализације 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);
    }

    // Гетери (пропуштени ради краткости)
}