# Savegame als Datei, welche API-Klasse benutzen



## raizer (14. Jul 2011)

Hallo,

ich bin dabei ein RPG in Java zu programmieren, habe soweit auch alles hinbekommen, nun bin ich aber beim Speichern angekommen. Ich habe auch eine ungefähre Vorstellung davon wie ich das machen könnte, es hapert aber an der Umsetzung.
Ich habe mir überlegt alle relevanten Werte in eine Datei zu schreiben und diese dann beim Laden wieder auszulesen und dann neue Objekte mit den in der Datei gespeicherten Werten zu erstellen.
In jeder Klasse, die ich im Laufe des Spiels erstelle, exsistieren Methoden die mir Werte wiedergeben können und auch Methoden die eben diese bearbeiten können. 
Jetzt habe ich nur noch das Problem, dass ich nicht weiß wie ich das Ganze in einer Datei so speichere, dass sich am Besten mit der Datei arbeiten kann. In C habe ich ähnliches schon gemacht, ich habe dort mit „ofstream“ eine Binär-Datei erstellt und dort die Werte eingeschrieben habe. In Java ist das Ganze aber für mich ein wenig undurchsichtig. Ich habe in der Bibliothek bereits geschaut und ich habe mehrere Möglichkeiten um eine Datei zu erstellen. Ich weiß nicht ob ich direkt mit Input- und OutputStream arbeiten soll oder mit einer der Instanzen.
Es wäre nett, wenn Ihr mir verraten könntet wann man welche Klasse am Besten benutzt und warum man diese gerade nimmt.
Ich hoffe das ich den richtigen Themenbereich gefunden habe und das man mein Problem wenigstens ungefähr überblickt – danke im Vorraus.

MfG Christian


----------



## SlaterB (14. Jul 2011)

Galileo Computing :: Java ist auch eine Insel – 16 Dateien, Verzeichnisse und Dateizugriffe
und vor allem dann
Galileo Computing :: Java ist auch eine Insel – 17 Datenströme


----------



## babuschka (14. Jul 2011)

Hallo,

Du könntest Deine zu speichernden Klassen das Interface Serializable implementieren lassen.
Dadurch kannst Du Deine Objekte bequem speichern und wieder laden - z.B. mit dem java.beans.XMLEncoder/XMLDecoder als XML-Datei oder per ObjectOutputStream.


----------



## AlexSpritze (15. Jul 2011)

JohnMcLane hat gesagt.:


> Hallo,
> 
> Du könntest Deine zu speichernden Klassen das Interface Serializable implementieren lassen.
> Dadurch kannst Du Deine Objekte bequem speichern und wieder laden - z.B. mit dem java.beans.XMLEncoder/XMLDecoder als XML-Datei oder per ObjectOutputStream.



Also entweder in einer Klasse das Interface Serializable implementieren und diese Klasse dann per ObjectOut/InputStream speichern/laden, oder über XMLDe/Encoder die Klasse in eine XML-Datei speichern/laden. Im letzteren Fall muss die Klasse aber dem Bean-Pattern gehorchen... dafür brauch sie dann kein Serializable Interface.

Nachteil der XML*Coder: Die Daten des Savegames liegen offen in der XML-Datei.

Wenn du etwas ähnlich binäres wie in C suchst, ist wohl mit dem Serializable Interface geholfen: Java ist auch eine Insel – 12.14 Persistente Objekte und Serialisierung

Also eine Klasse 
	
	
	
	





```
SaveGame
```
 machen und in der die Daten halten.

```
public class SaveGame implements Serializable { ... }
```


----------



## babuschka (15. Jul 2011)

Es besteht natürlich immer noch die Möglichkeit, das Ganze zusätzlich zu verschlüsseln.

Hier ein Beispiel, wie man in java Verschlüsselungen nutzen kann: Link


----------



## raizer (15. Jul 2011)

Erstmal danke für die schnellen Antworten.

Ich denke, dass ich die Lösung mit dem Interface Serializable machen werde, da ich das ganze nicht noch komplizierter machen wollte als es muss - also ohne extra Verschlüsselung und co. Mir gefällt die Lösung gut, da die Daten nicht offen liegen, aber dennoch lecht zu handhaben sind.

Aber warum muss ich das Interface implementieren, kann ich nicht einfach gleich mit Input-/OutputStream arbeiten? Das ist nur eine reine Verständnissfrage, da wir in Programmieren noch nicht mit Dateien gearbeitet haben, zumindest nicht in Java.


----------



## AlexSpritze (15. Jul 2011)

raizer hat gesagt.:


> Aber warum muss ich das Interface implementieren, kann ich nicht einfach gleich mit Input-/OutputStream arbeiten? Das ist nur eine reine Verständnissfrage, da wir in Programmieren noch nicht mit Dateien gearbeitet haben, zumindest nicht in Java.



Dieses Interface Serializable ist ein sog. Marker-Interface. Es definiert keine Methoden, sondern dient lediglich dazu anzuzeigen, diese Klasse kann serialisiert werden. Deshalb implementieren Klassen, wie String, dieses Interface auch.

Wenn du versuchst eine Klasse zu serialisieren, die das Interface nicht implementiert hat, dann wird eine Exception (NotSerializableException) geworfen.


----------



## Kr0e (16. Jul 2011)

Die Strings liegen schon offen rum, aber verändern kann man die direkt nicht, denn im Stream ist auf binäre Weise jeweils die Länge des folgenden Strings angegeben. Wenn der String geändert wird (länger/kürzer) dann gibt es beim Dekodieren sowieso eine StreamCorruptedException.

Aber ich würde dir noch eine zusätzliche Sache empfehlen:

Schachtel den ObjectInput/OutputStream mit einem Deflater/Inflater/Input/OutputStream. Das ist ein Kompressionsstream. Dadurch hast 2 weitere Vorteile:

Der Inhalt ist ab wann WIRKLICH nicht mehr lesbar und besteht nur noch aus merkwürdigen Zeichen und deine Datei ist kleiner, was bei ObjectInput/OutputStream ratsam ist, da der dort verwendete Algorithmus leider sehr langsam und sehr ineffizient Daten speichert. Für eine Map ist das vollkommen egal, aber verwende diese Streams nicht, um Daten übers Netzwerk auszutauschen 

Gruß,

Chris


----------



## raizer (16. Jul 2011)

Ok, dann sage ich vielen Dank und ich werde Euch auf dem Laufenden halten ob es funktioniert hat oder ob ich noch Probleme habe.

MfG Christian


----------

