Sobes.tech
Junior

Какви са сериализируемите и пакетираните обекти?

sobes.tech AI

Отговор от AI

Обектите, които могат да бъдат сериализирани, могат да бъдат преобразувани в байтов поток за съхранение или предаване, използвайки стандартния механизъм на Java java.io.Serializable.

Обектите, които могат да бъдат парселизирани, също могат да бъдат опаковани и разопаковани, но използват специализиран механизъм на Android android.os.Parcelable. Този механизъм е по-ефективен за предаване на данни между компоненти на Android, тъй като е оптимизиран за IPC (межпроцесна комуникация).

Характеристика Serializable Parcelable
Механизъм Java reflection Android Parceling API
Производителност По-малко ефективен (използва reflection) По-ефективен
Реализация По-проста (маркерен интерфейс) Изисква реализиране на методите writeToParcel, createFromParcel, describeContents
Използване Стандартно Java приложение, отдалечен извикване на методи (RMI) Специфично за Android, предаване на данни между активити, услуги и др.
Бойлерплейт По-малко код Повече код

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

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