2011-06-02 6 views
0

J'ai une classe singleton que je sauvegarde et la restauration:readResolve avec serialisable ne semble pas fonctionner

private void saveData(){ 
    FileOutputStream saveFile; 
    saveFile = this.openFileOutput(STATE_SAVE_FILE_NAME, Context.MODE_PRIVATE); 
    ObjectOutput output = new ObjectOutputStream(saveFile); 
    output.writeObject(deck); 
} 


private void restoreData(){ 
    FileInputStream restoreFile; 

    restoreFile = this.openFileInput(STATE_SAVE_FILE_NAME); 

    ObjectInput input = new ObjectInputStream(restoreFile); 
    deck = (Deck) input.readObject(); 
} 

La plate-forme d'objet est un singleton donc j'ai une méthode readRestore définie en elle:

private Object readResolve() { 
    return deck; 
} 

Quand je sauverai il y a certainement des données, mais la restauration ne me donne rien. Est-ce que je manque quelque chose?

fonctionne vraiment sauver la parce que je suis en mesure de sauvegarder et de restaurer d'autres objets. Seul le singleton échoue.

Répondre

1

Cette méthode readResolve() fait l'objet désérialisé être complètement jeté et la valeur actuelle de la « plate-forme » à retourner par readObject() au lieu. Si ce n'est pas votre intention, il devrait peut-être mettre à jour 'deck' avec les données de l'objet désérialisé, qui est 'this' dans la méthode readResolve().

+0

Pourquoi tous les exemples montrent que vous avez juste besoin de retourner celui que vous obtenez de returnInstance (ou l'équivalent)? Exemple: http://www.oodesign.com/singleton-pattern.html – theblitz

+0

@theblitz Votre code n'est pas le même que ce qu'il y a dans le lien que vous avez posté. Cet exemple montre comment continuer à renvoyer la même instance de singleton qui existe déjà. Ils suppriment donc l'objet désérialisé et renvoient getInstance(). Vous essayez de modifier l'état singleton via la désérialisation, mais vous n'y parvenez pas, car vous rejetez également l'objet sérialisé et renvoyez 'deck', qui pourrait même être nul. Pas du tout le même code et pas dans le même but. – EJP

+0

Donc, lors du premier appel, je devrais copier "this" dans "deck", puis le retourner. Lors d'appels ultérieurs juste retour "pont"? – theblitz