Sobes.tech
Junior

Ce sunt obiectele serializabile și parcelabile?

sobes.tech AI

Răspuns de la AI

Obiectele serializabile pot fi transformate în flux de octeți pentru stocare sau transfer, folosind mecanismul standard Java java.io.Serializable.

Obiectele parcelabile pot fi, de asemenea, împachetate și despachetate, dar utilizează un mecanism specializat Android android.os.Parcelable. Acest mecanism este mai eficient pentru transferul de date între componentele Android, deoarece este optimizat pentru IPC (Comunicare între Procese).

Caracteristică Serializable Parcelable
Mecanism Reflexie Java API de parcelare Android
Performanță Mai puțin eficient (folosește reflexie) Mai eficient
Implementare Mai simplu (interfață de marcaj) Necesită implementarea metodelor writeToParcel, createFromParcel, describeContents
Utilizare Aplicație Java standard, apeluri RMI Specific pentru Android, transfer de date între activități, servicii etc.
Șablon Mai puțin cod Mai mult cod

Exemplu de implementare a 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; // De obicei 0, dacă nu există descriptor de fișier special
    }

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

    // Getters (omise pentru concizie)
}