Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo,
ich bin auf der suche nach einer möglichkeit den Spielstand für mein kleines Spielchen zu speichern.
Dabei bin ich über Serialization "gestolpert".
Die ersten Versuche damit sind sehr vielversprechend wobei ich jedoch noch eine sache vermisse.
Ich benutze die Methoden ObjectOutputStream.writeObject() und ObjectInputStream.readObject().
Gibt es innerhalb des Objektes eine Mehode die aufgerufen wird wenn das Objekt vollständig geladen wurde ? Also eine "Ich bin fertig mit laden" Methode?
Ich habe bereits die Methode:
Java:
public class SerializationTestClass1 implements Serializable {
Data data = null;
public SerializationTestClass1(){
data = new Data();
}
private void readObject(ObjectInputStream inputStream) <- aufruf erfolgt bevor daten geladen wurden
throws IOException, ClassNotFoundException
{
System.out.println("Daten werden geladen...");
// data == null !!!!
}
}
gefunden. Sie wird jedoch aufgerufen wenn das Object bereits wieder erstellt wurde aber noch keine Daten hineingeladen wurden. Also so:
Hallo Kekz,
ich würde dir auch empfehlen in die Richtung zu gehen die Thallus dir vorschlägt, da es meiner Meinung nach nicht zum logischen readObject dazugehörigent und somit auch nichts in der Methode zu suchen hat. Erstelle also eine Methode die man aufruft, welche erst readObject() und danach binFertig() aufruft.
Ich würde es jedoch in etwa so machen:
Java:
public class Spielstand implements Serializable {
private int gold;
// mehrere variablen
public Spielstand(int gold /*andere params*/){
this.gold = gold;
/*...*/
}
public static Spielstand laden(/*evtl welcher, wenn mehrere*/){
/*Spielstand laden und zurückgeben*/
// object laden als Spielstand und zurückgeben
// Und nun soll die Klasse die das Object bekommt weiter verantwortlich sein !
}
public void speichern()
/* Speichern des Spielstandes */
}
}
Ersteinmal vielen Dank für die hilfreichen Antworten.
Was genau würde den gegen die Lösung von Dompteur sprechen ? Gibt es einen speziellen Grund oder wäre das nur aus Gründen der "Sauberkeit" ?
Weil mein Problem wäre dass ich mehrere verschiedene Klassen habe die ich lade und diese Klassen nicht immer "verwandt" miteinander sind. Demnach würde meine "Spielstand laden()" methode in etwa so aussehen:
Java:
public static Spielstand laden(...){
//in einer schleife für mehrere Objekte
Object obj=in.readObject();
if(obj instanceof ObjectA)
((ObjectA)obj).ichBinFertigObjA();
if(obj instanceof ObjectB)
((ObjectB)obj).ichBinFertigObjB();
if(obj instanceof ObjectC)
((ObjectC)obj).ichBinFertigObjC();
....
}
Oder ich müsste mein Programm so umbauen das jede einzelne Klasse von einer Basisklasse erbt welche die .ichBinFertig() Methode bereitstellt.
Machbar wäre beides nur sollte es mir den Aufwand wert sein ? :bahnhof:
Also bei diesem Problem würd ich persönlich ein Interface benutzen welches du bei all deinen Objecten implementierst und dann Finishable heißt und eine methode onFinish enthält, oder so ähnlich.
Ich würde es dir auf jeden fall empfehlen, da wenn du jetzt ein neues 4tes Objekt bauen willst dann musst du extremen Aufwand betreiben, anderes musst du nur das Interface implementieren.
Zudem wird dein Code übersichtlicher !
Und dabei kannst du auch die Lösung von Dompteur benutzen.