Collections (De)-Serialisierung meines HashSets

Tsunami

Mitglied
Hallo,

ich stehe momentan vor einem Problem, dass mich wirklich zur Verzweiflung bringt und ich habe leider überhaupt keinen Ansatz mehr.

Ich möchte ein kleines, selbst lernendes Schachspiel entwickeln (mehr oder weniger zu Übungszwecken) die eigentliche Spielsteuerung funktioniert soweit auch. Momentan haperts am "Dazulernen". Das Verfahren beruht darauf, dass eine Spielsituation gespeichert wird, die zum Verlust geführt hat um diese in Zukunft zu vermeiden.

Das Grundverfahren soll so laufen:

Ich habe ein Objekt vom Typ Situation (mehrdimensionales Array mit int-Werten), und ein Objekt von Memory-Einträgen (int-Wert für den Spieler schwarz/weiß, Objekt der Spielsituation). Diese Memory-Einträge serialisiere und deserialisiere ich, damit die gelernten Situationen auch nach dem Programmstart noch verfügbar sind.

Das Problem dabei ist: alle Einträge, die durch das Deserialisieren geladen werden, werden nur teilweise korrekt verarbeitet. Der Wert für den Spieler wird korrekt eingelesen, die Spielsituation allerdings nicht, dort wird überall nur eine 0 wiedereingelesen.

Leider kann ich nicht herausfinden, ob das Problem bei der Serialisierung oder der Deserialisierung liegt, weil ja eins vom anderen abhängt.

So, nun genug geschrieben, hier kommt der Code. Entscheidend sollten storeMemory() und restoreMemory() sein, dennoch der komplette Zusammenhang:

Java:
import java.util.*;
import java.io.*;

public class Memory
{	
	static HashSet<MemoryEntry> BannedSituations;
		
	static void resetMemory()
	{
		BannedSituations = new HashSet<MemoryEntry>();
	}
	
	public static void addSituation(Situation s, int player)
	{
		if(BannedSituations.add(new MemoryEntry(s, player)))
			System.out.println("Banned Situation added!");
	}

	static void storeMemory()
	throws IOException
	{
		FileOutputStream fos = new FileOutputStream("memory.ser");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(BannedSituations);
		oos.close();		
	}
		
	@SuppressWarnings("unchecked")
	static void restoreMemory()
	throws IOException, ClassNotFoundException
	{
		FileInputStream fis = new FileInputStream("memory.ser");
		ObjectInputStream ois = new ObjectInputStream(fis);
		BannedSituations = ((HashSet<MemoryEntry>) ois.readObject());
		ois.close();
	}
	
	public static boolean isBanned(Situation s, int player)
	{
		if(BannedSituations.contains(new MemoryEntry(s, player)))
			return true;
		return false;
	}
}

class MemoryEntry implements Serializable
{	
	private static final long serialVersionUID = 1L;
	
	Situation BannedSituation;
	int player;
	
	MemoryEntry(Situation s, int player)
	{
		this.BannedSituation = s;
		this.player = player;
		//this.print();
	}
	
	@Override
	public boolean equals(Object obj){
		MemoryEntry entry;
		if(obj instanceof MemoryEntry)
			entry = (MemoryEntry) obj;
		else
			return false;

		if(this.player != entry.player)
			return false;
		
		if(this.BannedSituation.equals(entry.BannedSituation) == false)
			return false;
		
		return true;
	}
	
	@Override
	public int hashCode() {
		int result = 17;
		result = 31 * result + this.BannedSituation.hashCode();
		result = 31 * result + this.player;
		return result;
	}
}

Java:
import java.io.Serializable;

import NM.*;

public class Situation extends SituationNM implements Serializable
{
	private static final long serialVersionUID = 1L;
	
	public Situation()   // Konstruktor zur Initialisierung 
	{
		feld = new int[][] {{1,1,1,1},{0,0,0,0},{0,0,0,0},{2,2,2,2}};
			   // Ausgangssituation f¸r das Spiel
	}
	
	@Override
	public boolean equals(Object obj){
		Situation sit;
		if(obj instanceof Situation)
			sit = (Situation) obj;
		else
			return false;

		for(int i = 0; i < 4; i++){
			for(int y = 0; y < 4; y++)
				if(this.feld[i][y] != sit.feld[i][y])
					return false;
		}
		
		return true;
	}
	
	@Override
	public int hashCode() {
		int result = 17;
		result = 31 * result + this.feld.hashCode();
		return result;
	}
}

Ich hoffe mir kann jemand auf die Sprünge helfen, inzwischen würden mich sogar Lösungen erfreuen.

Vielen Dank im Voraus und schöne Pfingsttage

Tsunami
 
Zuletzt bearbeitet:

eRaaaa

Top Contributor
Was mir auf Anhab auffällt ist, dass du flush vom ObjectOutputStrem nicht aufrufst. Versuch erstmal das.

Er ruft close() auf, da wird automatisch geflusht, das sollte also nicht das Problem sein! Der Rest ist etwas undurchsichtig. Wie hast du feld in der Oberklasse deklariert usw. Wie testest du das Ganze?

Java:
	public static void main(String[] args) throws Exception {
		Situation s = new Situation();
		s.feld = new int[][]{{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; //testweise feld = public
		Memory.resetMemory();
		Memory.addSituation(s, 3);
		Memory.addSituation(new Situation(), 1); //fuellen mit def werten
		Memory.addSituation(new Situation(), 2); //fuellen mit def werten
		Memory.storeMemory();
		Memory.resetMemory();
		Memory.restoreMemory();
		for (MemoryEntry e : Memory.BannedSituations) {
			int[][] situation = e.BannedSituation.feld;
			for (int[] is : situation) {
				System.out.println("Player "+e.player+" "+Arrays.toString(is));
			}
			System.out.println("-----");
		}
	}

liefert mir
Code:
Banned Situation added!
Banned Situation added!
Banned Situation added!
Player 1 [1, 1, 1, 1]
Player 1 [0, 0, 0, 0]
Player 1 [0, 0, 0, 0]
Player 1 [2, 2, 2, 2]
-----
Player 2 [1, 1, 1, 1]
Player 2 [0, 0, 0, 0]
Player 2 [0, 0, 0, 0]
Player 2 [2, 2, 2, 2]
-----
Player 3 [1, 2, 3]
Player 3 [4, 5, 6]
Player 3 [7, 8, 9]
Player 3 [10, 11, 12]
-----

Also wird die Situation, sowie der int für den Player korrekt deserialisiert. Also, wie erstellst du die Situations-Objekte etc.?! Vlt. wird es dann etwas klarer
 

Tsunami

Mitglied
Vielen Dank ersteinmal für die Antworten. Mit dem Codeschnipsel, den Du geschrieben hast, eRaaaa funktioniert es bei mir auch. Das Problem schien daran zu liegen, dass ich mit nur einer Situation gearbeitet habe, die ich dann durch eine Methode inhaltlich verändert habe.

Java:
		System.out.println("Memory reset!"); Memory.resetMemory();
		System.out.println("Memory restore!"); Memory.restoreMemory();

		int[][] f0 = new int[][] {{1,1,1,1},{0,0,0,0},{0,0,0,0},{2,2,2,2}};
		int[][] f1 = new int[][] {{1,1,1,0},{0,0,1,0},{0,0,0,0},{2,2,2,2}};
		int player = 1;
		Situation S = new Situation();
		
		S.change(f0);
		Memory.addSituation(S, player);
		S.change(f0);
		Memory.addSituation(S, player);

		System.out.println("Memory store!"); Memory.storeMemory();
		System.out.println("Memory reset!"); Memory.resetMemory();
		System.out.println("Memory restore!"); Memory.restoreMemory();

        for (MemoryEntry e : Memory.BannedSituations) {
            int[][] situation = e.BannedSituation.feld;
            for (int[] is : situation) {
                System.out.println("Player "+e.player+" "+Arrays.toString(is));
            }
            System.out.println("-----");
        }

Momentan siehts erstmal so aus als würde es mit neuen Objekten funktionieren - Danke!

Hat evtl. auch noch jemand die überschreibende hashCode()-Methode für Arrays, die, sofern jeder Wert an der gleichen Position gleich ist, auch einen gleichen hashCode zurück liefert? Sonst wird 1. das hashSet mit gleichen Situationen gefüllt und 2. die gebannte Situation nicht erkannt.

Leider habe ich da keinen weiteren Ansatz als den im ersten Post verfügbaren in der Situation-Klasse, der im Nachhinein sogar für mich sinnlos erscheint. :D

Ich gehe mal davon aus, dass das ein Problem ist, für das es inzwischen eine feste Lösung gibt. Sollte es komplexer sein eröffne ich dafür natürlich auch gerne einen neuen Thread.

Gruß Tsunami
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Problem mit der Serialisierung Java Basics - Anfänger-Themen 31
M Serialisierung in Java Java Basics - Anfänger-Themen 10
S Serialisierung: Laden von Objekten - Risiken? Java Basics - Anfänger-Themen 4
C Java Applet Fragen: Serialisierung, Excel import Java Basics - Anfänger-Themen 2
I Input/Output Alternative zur Serialisierung/ ImageJ Objecte Java Basics - Anfänger-Themen 7
W Nullpointer bei Objekt Serialisierung mit ArrayList<byte[]> etc. Java Basics - Anfänger-Themen 2
V Java Serialisierung Java Basics - Anfänger-Themen 2
O Objekt Listen serialisierung und deserialisieren Java Basics - Anfänger-Themen 5
U Serialisierung Probleme bei Umsetzung Java Basics - Anfänger-Themen 26
V Serialisierung Umbennung einer Klasse Java Basics - Anfänger-Themen 2
G Input/Output Serialisierung oder Datenbank Java Basics - Anfänger-Themen 6
K Input/Output Serialisierung Java Basics - Anfänger-Themen 7
P Serialisierung - Objekte vergleichen Java Basics - Anfänger-Themen 4
J Input/Output Serialisierung Java Basics - Anfänger-Themen 6
K Serialisierung: speichern und auslesen, auslesen klappt nicht Java Basics - Anfänger-Themen 14
B Std-Serialisierung - Speichern/Laden geht nur auf einem Rechner Java Basics - Anfänger-Themen 17
W Problem mit Serialisierung von jTable Java Basics - Anfänger-Themen 15
E Serialisierung - Exception? Java Basics - Anfänger-Themen 21
J Input/Output Serialisierung Java Basics - Anfänger-Themen 6
W Problem mit Serialisierung und TableModel Java Basics - Anfänger-Themen 3
F Sonderzeichen bei XML Serialisierung nicht konvertieren Java Basics - Anfänger-Themen 7
O Serialisierung: Object abspeichern und aufrufen Java Basics - Anfänger-Themen 6
L Java Serialisierung Singleton Java Basics - Anfänger-Themen 6
Luk10 Serialisierung bei schon vorhandener Datei Java Basics - Anfänger-Themen 15
I Serialisierung ClassNotFound Java Basics - Anfänger-Themen 8
S serialisierung Java Basics - Anfänger-Themen 3
E Alternativen zur binären Serialisierung ? Java Basics - Anfänger-Themen 9
J Serialisierung - Array-Objekt serialisieren/deserialisieren Java Basics - Anfänger-Themen 6
G Frage zu Serialisierung Java Basics - Anfänger-Themen 4
M Serialisierung erstes Beispiel Java Basics - Anfänger-Themen 4
A Per Serialisierung speichern Java Basics - Anfänger-Themen 2
DStrohma Problem mit Serialisierung Java Basics - Anfänger-Themen 3
T Threads und Serialisierung Java Basics - Anfänger-Themen 4
Z Serialisierung vs. Sicherheit Java Basics - Anfänger-Themen 2
R Serialisierung von Objekten Java Basics - Anfänger-Themen 12
S Serialisierung Java Basics - Anfänger-Themen 8
G Objekt Serialisierung Java Basics - Anfänger-Themen 3
P Serializable - Serialisierung Java Basics - Anfänger-Themen 5
P Collection Vector speichern mittels Serialisierung? Java Basics - Anfänger-Themen 2
Kydo Beschreibung meines programms Java Basics - Anfänger-Themen 2
Düsseldorf2002 Testen meines Algorithmus Java Basics - Anfänger-Themen 1
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
S Methoden Beim Start meines Projektes eine Methode ausführen Java Basics - Anfänger-Themen 14
L Compiler-Fehler Komische Ausgabe meines Programms Java Basics - Anfänger-Themen 6
U Farbe meines Würfels jede sekunde ändern! Java Basics - Anfänger-Themen 5
Streeber reale Laufzeit meines Programms ausgeben Java Basics - Anfänger-Themen 1
M Aufbessern meines Codes Java Basics - Anfänger-Themen 11
M Bitte um Kontrolle meines Quelltextes Java Basics - Anfänger-Themen 10
H Optische Aufmachung meines Programms Java Basics - Anfänger-Themen 76
B Absturz der VM bei Ausführung meines Programms Java Basics - Anfänger-Themen 3
G wie finde ich den pfad meines programms raus? Java Basics - Anfänger-Themen 2
P Verzeichnis meines Programms Java Basics - Anfänger-Themen 4
G Dringende Frage bzgl. meines Codes Java Basics - Anfänger-Themen 30
V Eclipse findet (meines Wissens) korrekte Klasse nicht Java Basics - Anfänger-Themen 3
K Collections Wie kann Ich eine Hashmap mit verschiedenen Hashsets füllen. Java Basics - Anfänger-Themen 4
M Mehrere HashSets verbinden. Java Basics - Anfänger-Themen 2
W zwei Hashsets durchsuchen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben