Sobes.tech
Junior

O que são objetos serializáveis e parceláveis?

sobes.tech IA

Resposta da IA

Objetos serializáveis podem ser convertidos em fluxo de bytes para armazenamento ou transmissão, usando o mecanismo padrão do Java java.io.Serializable.

Objetos parceláveis também podem ser empacotados e desempacotados, mas usam um mecanismo especializado do Android android.os.Parcelable. Este mecanismo é mais eficiente para transferência de dados entre componentes do Android, pois é otimizado para IPC (Comunicação entre Processos).

Característica Serializable Parcelable
Mecanismo Reflexão em Java API de Parceling do Android
Desempenho Menos eficiente (usa reflexão) Mais eficiente
Implementação Mais simples (interface de marcador) Requer implementação dos métodos writeToParcel, createFromParcel, describeContents
Uso Aplicação Java padrão, chamadas remotas (RMI) Específico do Android, transferência de dados entre atividades, serviços, etc.
Modelo Menos código Mais código

Exemplo de implementação 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, se não houver descritores de arquivo especiais
    }

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

    // Getters (omitidos por brevidade)
}