Sobes.tech
Middle

Qual é a diferença entre Serializable e Parcelable no Android?

sobes.tech IA

Resposta da IA

A principal diferença está no desempenho e na forma de implementação.

  • Serializable:

    • Interface padrão do Java SE.
    • Mais fácil de implementar (basta implementar a interface).
    • Usa Java Reflection API para serialização, o que é mais lento e requer mais memória.
    • Adequado para objetos pequenos ou quando o desempenho de serialização não é crítico.
  • Parcelable:

    • Interface específica para o SDK Android.
    • Requer uma descrição explícita do processo de serialização/deserialização.
    • Muito mais rápido e eficiente em uso de memória, pois não depende de Reflection.
    • Melhor escolha para transferir objetos entre componentes do Android (Activity, Service, BroadcastReceiver) e para salvar estado.

Para implementar Parcelable, é necessário:

  1. Implementar a interface Parcelable.
  2. Implementar o método writeToParcel() para escrever dados em Parcel.
  3. Implementar o método describeContents().
  4. Criar um objeto estático CREATOR, que é uma implementação da interface 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);
    }
}

Tabela comparativa:

Característica Serializable Parcelable
Biblioteca java.io android.os
Desempenho Baixo (usa Reflection) Alto
Eficiência de memória Baixa Alta
Implementação Mais simples Mais complexa
Uso Java geral, pequenos dados Android, transferência entre componentes