Sobes.tech
Junior

Qu'est-ce que des objets sérialisables et parcelables?

sobes.tech IA

Réponse de l'IA

Les objets sérialisables peuvent être convertis en flux de bytes pour le stockage ou la transmission, en utilisant le mécanisme standard de Java java.io.Serializable.

Les objets parcelables peuvent également être empaquetés et dépaquetés, mais utilisent un mécanisme spécialisé d'Android android.os.Parcelable. Ce mécanisme est plus efficace pour le transfert de données entre composants Android, car il est optimisé pour l'IPC (Communication Inter-Processus).

Caractéristique Serializable Parcelable
Mécanisme Réflexion en Java API de Parceling d'Android
Performance Moins efficace (utilise la réflexion) Plus efficace
Implémentation Plus simple (interface de marqueur) Nécessite l'implémentation des méthodes writeToParcel, createFromParcel, describeContents
Utilisation Application Java standard, appels RMI Spécifique à Android, transfert de données entre activités, services, etc.
Modèle Moins de code Plus de code

Exemple d'implémentation 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; // Normalement 0, s'il n'y a pas de descripteurs de fichiers spéciaux
    }

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

    // Getters (omis pour la brièveté)
}