1

Voilà mon problème: on a un jeu à faire et il faut pouvoir une sauveguarde. Le prof nous a dit de mettre des méthodes toString() dans toutes les classes où on voulait sauver les informations... le problème c'est que je suis pressé (c'est pour mardi après midi) donc je cherche des racourcis.

J'ai entendu parlé de la serialization et je voudrais:

1/savoir si c'est adapté à la sauveguarde d'un jeu complexe: http://fpgforce.dyndns.org/~jyaif/PR102/applet.html
2/savoir comment utiliser cette interface
3/savoir si c'est possible de serializer une classe qui contient des réfèrences vers d'autres classes
4/savoir si il faut aussi serializer les classes référencer
5/savoir si toutes les classes peuvent être serializée.

2

Java s'occupe de tout. Tu as juste à faire implémenter à ta classe PartieDeJeu l'interface Serializable (qui ne contient aucune méthode). Ensuite, tu dois utiliser un ObjetOutputStream pour écrire ton objet sur un fichier.

Pour les question 3, 4 et 5 : oui.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

3

Bon, ça commence à marcher mais j'ai pleins de problèmes...

Sasume> il semblerait que en fait toutes les classes ne soit pas serialisable (comme par exemple les threads) sad

4

Et les sous-classes d'OutputStream.

Des problèmes comme quoi ?

5

Je dé-serialise des classes où il y a souvent plusieurs références vers les même objets. On dirait que la dé-serialisation crée plusieurs fois les même objets, et donc 2 références qui pointaient sur le même objet ne pointent plus sur le même objet sick

Je pense que je m'y prends mal, voilà l'organisation du prog:

J'ai une classe Game qui crée un objet gui de type UserInterface et un objet engine de type GameEngine:
engine = new GameEngine(this);
gui = new UserInterface(engine);
engine.initGameEngine(gui);

Quand je sauve l'état du jeu au milieu d'une partie, je sérialise dans Game la classe engine.
Quand je dé-sérialise engine, je suis obligé de re-initialiser la référence dans gui vers engine, sinon gui continue à s'occuper de l'ancien GameEngine!:
engine = (GameEngine)in.readObject();
gui.setEngine(engine);

Là c'était simple à corrigé, mais je dois faire qlqchose de similaire dans bcp bcp d'endroits couic


A part ça j'ai aussi beaucoup d'objets de la classe Timer (qui n'est pas serialisable) sad

6

Bon, j'ai contourné le premier pb en serialisant carrement toute le classe Game (ce qui m'a pris près de 4h...)

7

Tu dis que si Engine a une référence sur Gui, et si Gui a une référence sur Engine, sérialiser Engine ne sérialise pas correctement le graphe ? (ou j'ai pas compris le pb).
J'ai essayé, ça a l'air de marcher correctement (cf ce petit test).

8

ExtendeD :
Tu dis que si Engine a une référence sur Gui, et si Gui a une référence sur Engine, sérialiser Engine ne sérialise pas correctement le graphe ?


oui. (pour mon programme)

J'ai essayé, ça à l'air de marcher correctement (cf ce petit test).

ok. C'est la faute à mon organisation donc mourn

9

hu hu,
http://xstream.codehaus.org/
ca t'aurais convenu je pense ... domage ^^

10

J'arrive à sérialiser un CaseKakuro[][], mais je n'arrive pas à désérialiser le fichier obtenu. Quelqu'un peut-il m'aider ?

Mes deux fonctions

protected void lireFichierGrilleXML(String fichier) {
		XStream xstream = new XStream(new DomDriver());
		xstream.alias("CaseKakuro", CaseKakuro.class);
		try {
			plancheDessin.tabCases = (CaseKakuro[][]) xstream
					.fromXML(new FileReader(fichier));
		} catch (FileNotFoundException e) {
			JOptionPane.showMessageDialog(this,
					"Impossible d'ouvrir le fichier " + fichier.toString(),
					"Erreur", JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
		}
	}


	protected void sauvegarderFichierGrilleXML(String fichier) {
		XStream xstream = new XStream();
		xstream.alias("CaseKakuro", CaseKakuro.class);
		try {
			xstream.toXML(plancheDessin.tabCases, new PrintStream(fichier));
		} catch (FileNotFoundException e) {
			JOptionPane.showMessageDialog(this,
					"Impossible de sauver dans le fichier " + fichier,
					"Erreur", JOptionPane.ERROR_MESSAGE);
			e.printStackTrace();
		}
	}

(plancheDessin.tabCases est le CaseKakuro[][])

Un exemple de grille ainsi crée
 <CaseKakuro-array-array>
 <CaseKakuro-array>
 <CaseKakuro>
  <type>2</type> 
  <indBas>5</indBas> 
  <indHaut>25</indHaut> 
  <valeur>0</valeur> 
  </CaseKakuro>
  </CaseKakuro-array>
  </CaseKakuro-array-array>


(Je dois absolument garder les deux dimensions).
Le gentil timide du 64

11

J'ai fait un test, il n'y a pas de problème.
Qu'est-ce qui ne marche pas exactement ? Poste un test case complet.

12

Si ça fonctionne sans erreur (meme si pour l'instant les cases ne sont pas ien exploitées).
En fait, la console (je travaille avec Eclipse) avait conservé le rapport d'erreur d'une ancienne session de lancement de la JVM.

J'ai également lu sur le site officiel que l'équipe tente actuellement d'ajouter la fonctionnalité créeant un DTD ou un XSD (et éventuellement vérifiant la concordance du fichier XML avec le schéma considéré). J'ai hâte qu'ils y arrivent!!
Le gentil timide du 64