Sobes.tech
Middle

¿Cuál es la diferencia entre Serializable y Parcelable en Android?

sobes.tech AI

Respuesta de la IA

La principal diferencia radica en el rendimiento y la forma de implementación.

  • Serializable:

    • Interfaz estándar de Java SE.
    • Más sencillo de implementar (solo hay que implementar la interfaz).
    • Utiliza Java Reflection API para la serialización, lo cual es más lento y requiere más memoria.
    • Adecuado para objetos pequeños o cuando el rendimiento de serialización no es crítico.
  • Parcelable:

    • Interfaz específica para Android SDK.
    • Requiere una descripción explícita del proceso de serialización/deserialización.
    • Mucho más rápido y eficiente en uso de memoria, ya que no depende de Reflection.
    • La mejor opción para transferir objetos entre componentes de Android (Activity, Service, BroadcastReceiver) y para guardar estado.

Para implementar Parcelable es necesario:

  1. Implementar la interfaz Parcelable.
  2. Implementar el método writeToParcel() para escribir datos en Parcel.
  3. Implementar el método describeContents().
  4. Crear un objeto estático CREATOR, que es una implementación de la interfaz 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);
    }
}

Tabla comparativa:

Característica Serializable Parcelable
Biblioteca java.io android.os
Rendimiento Bajo (usa Reflection) Alto
Eficiencia de memoria Baja Alta
Implementación Más sencilla Más compleja
Uso Java general, datos pequeños Android, transferencia entre componentes