Sobes.tech
Junior

Cosa sono gli oggetti serializzabili e parcelabili?

sobes.tech AI

Risposta dell'AI

Gli oggetti serializzabili possono essere convertiti in un flusso di byte per l'archiviazione o la trasmissione, utilizzando il meccanismo standard di Java java.io.Serializable.

Gli oggetti Parcelable possono anche essere impacchettati e scompattati, ma utilizzano un meccanismo specializzato di Android android.os.Parcelable. Questo meccanismo è più efficiente per il trasferimento di dati tra componenti Android, poiché è ottimizzato per IPC (Comunicazione Inter-Processo).

Caratteristica Serializable Parcelable
Meccanismo Riflessione Java API di Parceling di Android
Prestazioni Meno efficiente (usa riflessione) Più efficiente
Implementazione Più semplice (interfaccia di marker) Richiede l'implementazione dei metodi writeToParcel, createFromParcel, describeContents
Utilizzo Applicazioni Java standard, chiamate RMI Specifico di Android, trasferimento di dati tra attività, servizi, ecc.
Template Meno codice Più codice

Esempio di implementazione di 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; // Di solito 0, se non ci sono descrittori di file speciali
    }

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

    // Getters (omessi per brevità)
}