2015-02-23 1 views
0

Je sais que des questions similaires ont été posées plusieurs fois, mais je n'ai pas trouvé une question qui était en fait la même - excuses si j'en manquais une . J'essaye de faire un petit jeu. Le jeu stocke mes personnages (esprits) dans un arraylist. Les esprits sont créés avec des caractéristiques différentes en créant différentes instances de ma classe d'esprit. Ensuite, je stocke cette instance dans mon arraylist qui détient mon parti. L'arraylist détient 3 éléments. Je souhaite sérialiser tous les champs de ces instances, les enregistrer dans un fichier, puis les charger à nouveau et les stocker à leur place dans l'arrayliste (essentiellement enregistrer/charger dans mon jeu).Sérialiser des objets référencés dans mon arraylist dans un fichier, puis les charger de nouveau dans cette liste

On m'a conseillé d'utiliser kyro pour la sérialisation, donc je l'utilise. Je suis assez sûr que le code est très similaire, et je dois imaginer la façon dont ce problème est résolu est fondamentalement le même.

Ceci est mon code en ce moment

public void usekryo(){ 

      Kryo kryo = new Kryo(); 
      kryo.register(Spirits.class); 
      Spirits writespirit; 
      Spirits readspirit; 

      for(int i=0;i<3;i++) { try (Output output = new Output(new FileOutputStream("spirits.ser"))) { 
      System.out.println("loop is going"); 
      writespirit = OwnedSpirits.myspirits.get(i); 
      kryo.writeClassAndObject(output, writespirit); 
      } catch (FileNotFoundException ex) { System.out.println("fail"); } } 

      Spirits blankarray = new Spirits(); 
      OwnedSpirits.myspirits.set(0, blankarray); 
      OwnedSpirits.myspirits.set(1, blankarray); 
      OwnedSpirits.myspirits.set(2, blankarray); 

      System.out.println(OwnedSpirits.myspirits.get(2).species); 

      for(int i=0;i<3;i++) { try (Input input = new Input(new FileInputStream("spirits.ser"))) { 
      System.out.println("now it's loading"); 
      readspirit = (Spirits) kryo.readClassAndObject(input); 
      OwnedSpirits.myspirits.set(i, readspirit); 

      } catch (FileNotFoundException ex) { System.out.println("fail"); } } 

      System.out.println(OwnedSpirits.myspirits.get(0).species); 
      System.out.println(OwnedSpirits.myspirits.get(2).species); 





    } 

Cela finit par faire exactement ce que je pensais que ce serait faire. Je voulais dire que je savais que cela ne résoudrait pas mon problème, mais je m'assurais juste d'utiliser correctement le kyro.

De toute façon, il fait une instance de ma classe d'esprit, charge la valeur dans le premier index de mon arraylist, puis sérialise cette nouvelle instance. Jusqu'ici tout va bien.

Mais alors il le fait à nouveau, et écrase ce que j'ai écrit la première fois. Puis le fait une 3e fois. Donc, les seules valeurs réellement sauvegardées sont ce qui est dans l'index [2] de mon arraylist.

Ensuite, quand je relireai ce fichier et que je l'écrirai de nouveau, les 3 index de mon arraylist sont remplis avec ce qui était initialement l'index [2] de mon arraylist.

Alors comment est-ce que j'écrirais ceci dans le monde de sorte que tous les 3 index soient sortis dans un dossier, et puis rentrent dans leurs propres index? J'espère que ce n'est pas super compliqué, mais je suis vraiment inquiet que ce soit.

Répondre

0

Vous le rendez plus compliqué que nécessaire. Vous devriez juste pouvoir sérialiser le conteneur (OwnedSpirits.myspirits).

+0

Je peux vraiment faire ça? J'ai supposé que cela ne ferait que sérialiser les références à chaque instance, et si je fermais mon programme et que j'essayais ensuite de lire ce fichier, ils ne référenceraient rien. Je vais essayer maintenant. –

+0

Cela fonctionne. Hou la la! Je n'aurais pas pensé que ça pourrait être aussi facile. J'ai eu un problème parce que l'arrayliste que j'utilise était définitif. Donc je l'ai juste fait pas définitif. Si j'ai besoin que ce soit définitif, je suppose que je devrai le charger dans une autre liste d'arithmétique et ensuite copier cela par une méthode, mais pour l'instant, cela fonctionne! –