Sobes.tech
Junior

¿Qué son los objetos serializables y parcelables?

sobes.tech AI

Respuesta de la IA

Los objetos serializables pueden convertirse en un flujo de bytes para almacenamiento o transmisión, utilizando el mecanismo estándar de Java java.io.Serializable.

Los objetos parcelables también pueden ser empaquetados y desempaquetados, pero utilizan un mecanismo especializado de Android android.os.Parcelable. Este mecanismo es más eficiente para la transferencia de datos entre componentes de Android, ya que está optimizado para IPC (Comunicación entre Procesos).

Característica Serializable Parcelable
Mecanismo Reflexión en Java API de Parceling de Android
Rendimiento Menos eficiente (usa reflexión) Más eficiente
Implementación Más simple (interfaz de marcador) Requiere implementar métodos writeToParcel, createFromParcel, describeContents
Uso Aplicaciones Java estándar, llamadas remotas (RMI) Específico de Android, transferencia de datos entre actividades, servicios, etc.
Plantilla Menos código Más código

Ejemplo de implementación de 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; // Normalmente 0, si no hay descriptores de archivos especiales
    }

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

    // Getters (omitidos por brevedad)
}