125 votes

Comment sérialiser un objet et l'enregistrer dans un fichier sous Android ?

Disons que j'ai une classe simple et qu'une fois qu'elle est instanciée en tant qu'objet, je veux pouvoir sérialiser son contenu dans un fichier, et le récupérer en chargeant ce fichier ultérieurement... Je ne sais pas trop par où commencer, que dois-je faire pour sérialiser cet objet dans un fichier ?

public class SimpleClass {
   public string name;
   public int id;
   public void save() {
       /* wtf do I do here? */
   }
   public static SimpleClass load(String file) {
       /* what about here? */
   }
}

C'est probablement la question la plus facile au monde, car il s'agit d'une tâche très simple dans .NET, mais dans Android, je suis plutôt novice et je suis donc complètement perdu.

Par ailleurs, je suis désolé si cette question fait double emploi, mais je ne l'ai vue nulle part sur SO. Merci d'avance pour votre aide.

243voto

Ralkie Points 1830

Sauvegarde (sans code de gestion des exceptions) :

FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE);
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(this);
os.close();

Chargement (sans code de gestion des exceptions) :

FileInputStream fis = context.openFileInput(fileName);
ObjectInputStream is = new ObjectInputStream(fis);
SimpleClass simpleClass = (SimpleClass) is.readObject();
is.close();
return simpleClass;

32voto

surfealokesea Points 982

J'ai essayé ces deux options (lecture/écriture), avec des objets simples, des tableaux d'objets (150 objets), des cartes :

Option1 :

FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE);
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(this);
os.close();

Option2 :

SharedPreferences mPrefs=app.getSharedPreferences(app.getApplicationInfo().name, Context.MODE_PRIVATE);
SharedPreferences.Editor ed=mPrefs.edit();
Gson gson = new Gson(); 
ed.putString("myObjectKey", gson.toJson(objectToSave));
ed.commit();

L'option 2 est deux fois plus rapide que l'option 1

L'inconvénient de l'option 2 est que vous devez faire un code spécifique pour la lecture :

Gson gson = new Gson();
JsonParser parser=new JsonParser();
//object arr example
JsonArray arr=parser.parse(mPrefs.getString("myArrKey", null)).getAsJsonArray();
events=new Event[arr.size()];
int i=0;
for (JsonElement jsonElement : arr)
    events[i++]=gson.fromJson(jsonElement, Event.class);
//Object example
pagination=gson.fromJson(parser.parse(jsonPagination).getAsJsonObject(), Pagination.class);

7voto

wzbozon Points 2851

Code complet avec gestion des erreurs et ajout de fermetures de flux de fichiers. Ajoutez-le à votre classe que vous voulez être capable de sérialiser et désérialiser. Dans mon cas, le nom de la classe est CreateResumeForm . Vous devez le changer pour votre propre nom de classe. Android interface Serializable ne suffit pas à enregistrer vos objets dans le fichier, il ne fait que créer des flux.

// Constant with a file name
public static String fileName = "createResumeForm.ser";

// Serializes an object and saves it to a file
public void saveToFile(Context context) {
    try {
        FileOutputStream fileOutputStream = context.openFileOutput(fileName, Context.MODE_PRIVATE);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
        objectOutputStream.writeObject(this);
        objectOutputStream.close();
        fileOutputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

// Creates an object by reading it from a file
public static CreateResumeForm readFromFile(Context context) {
    CreateResumeForm createResumeForm = null;
    try {
        FileInputStream fileInputStream = context.openFileInput(fileName);
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        createResumeForm = (CreateResumeForm) objectInputStream.readObject();
        objectInputStream.close();
        fileInputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return createResumeForm;
}

Utilisez-le comme ceci dans votre Activity :

form = CreateResumeForm.readFromFile(this);

3voto

Mikpa Points 1349

Jetez un coup d'œil à [Android] Comment préserver un objet complexe lors du redémarrage d'une activité ?](http://stackoverflow.com/questions/1636623/android-how-do-i-preserve-a-complex-object-across-activity-restarts) où cette question est abordée

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X