# Speichern un Laden mit Serializable



## Apollo4 (29. Jul 2012)

Hi,

ich bin dabei ein kleines Spiel zu programmieren, jetzt soll man den Spielstand auch speichern und laden können.

Der Aufbau ist nach MVC.

Welche Klasse muss ich jetzt speicher und wiederherstellen?

Hätte jetzt gesagt einfach das komplette Spiel als Objekt abspeichern und beim laden das Spielobjekt zu ersetzen.
Das funktioniert bei mir so nicht dann reagiert gar nichts mehr. 

Also habe nur bei den Level- und die Model Klassen Serializable implementiert, da die auch alle Daten beinhalten. gespeichert und neu geladen. Aber irgendwie vermixt sich da der alte und neue Spielstand.

Ich habe z.B. eine Klasse Observ als Observerklasse, die alles enthält, was aktualisiert werden muss
Konstruktor:


```
public Observ extends Observable (Player player, Level level...){
this.player=player;
...}
```

Obwohl die Objekte ja nur weitergerecht werden von Model (Player extends Model) / Level werden diese nicht mit aktualisiert. :bahnhof:


----------



## Apollo4 (30. Jul 2012)

Also die Klasse Observ ist z.B. komplett null, obwohl diese als Serializable implementiert wurde. Die Controller Klasse die das Observer Objekt hält habe ich gespeichert.
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

Die dafür zuständige Klasse sieht so aus:



```
public class Save {

    private static String file = "./savegame";

    public static void serialize(Control obj) {
        try {
            FileOutputStream data = new FileOutputStream(file);
            ObjectOutputStream o = new ObjectOutputStream(data);

            o.writeObject(obj);
            
            o.close();
        } catch (IOException e) {
            System.err.println(e);
        }
    }

    public static void deserialize(Control obj) {
        try {
            FileInputStream data = new FileInputStream(file);
            ObjectInputStream o = new ObjectInputStream(data);
            
            obj= new Control((Control) o.readObject());
            o.close();
        } catch (IOException e) {
            System.err.println(e);
        } catch (ClassNotFoundException e) {
            System.err.println(e);
        }
    }
```

Warum speichert er die Observer Klasse nicht, oder warum müssen diese weitergeleiteten Objekte der Observer Klasse überhaput gespeichert werden. Diese werden doch schon von den Model Klassen gehalten?


----------



## nillehammer (30. Jul 2012)

```
obj= new Control((Control) o.readObject());
```
Du verwendest hier nach der Deserialisierung offensichtlich einen Copy-Konstruktor. Ist das Absicht? Warum? Vielleicht hast Du in dem Konstruktor vergessen, den Observer mit zu kopieren. Für "normales" Deserialisieren brauchst Du eigentlich keinen Copy-Konstruktor. Da reicht auch das:

```
Control control = (Control) o.readObject();
```


----------



## Apollo4 (30. Jul 2012)

Den Copy Konstruktor habe ich schon extra erstellt, hat aber nichts genützt. Wenn ich 

```
Control control = (Control) o.readObject();
```
setze ändert sich beim Laden nichts... deswegen dachte ich vielleicht muss man den kopieren.

Den einzigsten fortschritt konnte ich erzielen als ich Level mit dem Model Objekten separat gespeichert und geladen habe. Da wurde die alte zustand geladen, aber seltsamerweise haben sich die neuen und alten daten vermixxt. z.B. können Items als Gegner auf ein mal herumlaufen^^

Kann mir das nur erklären, da ich die Observer Klasse jetzt nicht mit gespeichert habe, aber da sind ja eig. nur die weitergereichten Objekte drin?

Frage mich auch warum ich nicht die komplette Klasse Control wieder laden kann. 
Falls es eine Rolle spielt, die Control klasse hat ein thread Objekt, dieses habe ich transient gemacht, da threads nicht serialisiert werden können, wie ich gelesen habe. Diese thread Klasse enthält keine Daten, nur eine Methode die ein control objekt erhält.


----------



## Apollo4 (30. Jul 2012)

Habe jetzt einfach alles refreshed und neu gespeichert, dann geht es.
Aber warum musste ich alle Objekte der Observer Klasse jetzt nochmal ersetzen?


----------

