ArrayList in eigenem Object nicht richtig serialisierbar

noil

Gesperrter Benutzer
hallo,
ich habe das Problem, dass ich ein Objekt über den Konstruktor erstelle, welches alle Variablen einer Klasse enthält, und dieses dann serialisiere. Wenn ich meine 30 Objekte die ich so Serialisiert habe wieder deserialisiere und mir die ArrayList<String> ausgeben lasse, dann hat diese bei jedem Objekt die Werte des ersten Objekts. Alle anderen Variablen sind korrekt nur bei meinen ArrayList<String> ist es bei allen der Wert vom ersten Objekt.
Muss man ArrayLists bestimmt serialiseren, oder wo liegt da das Problem? Alle meine Arrays funktionieren so wie sie sollen, falls das was hilft.
Habe auch schon SuFu benutzt aber nix brauchabres gefunden.
Grüße Noil
 

Joose

Top Contributor
Hier wäre etwas Code angebracht.

Wie schaut die Klasse der Objekte aus die serialisiert werden? Wie schaut der Code zum Serialisieren bzw. Deserialisieren aus?
 

noil

Gesperrter Benutzer
Ja ok klar,
dachte vielleicht wäre da von vornherein was zu ArrayLists zu sagen ^^.

Java:
public class Schreiben implements Serializable{
	public ArrayList<String> sieger=new ArrayList<String>();
	public String[]sie;
	public String[]sier;
	public ArrayList<String> sieg=new ArrayList<String>();
	public Object[]habe;
	public int[]anzahlSpielerGenau;
	public int[]anzahlSpielerr;
	public int[][]feldkartenn;
	public int[][]flush;
//	 static int[][]strasse;
	public Object[] zahlenverhaeltnis;
	public int[] initiativee;
	public int[][]straight;
	public double[] pott;
	public int positionIch;
	public int[] handKarten;
	public int[] feldKarten;
	public double[][]einsatz;
	public double gewinn;
	
	 ArrayList<Object> list=new ArrayList<Object>();
	 
	 public Schreiben(ArrayList<String> siegg, ArrayList<String> siegerr, int[]anzahlSpielerrGenau, double gewin, Object[] habe2,int[]anzahlSpieler,int[][]feldkartennn,int[][]flushh,int[][]straightt,Object[] zahlenverhaeltnis2,int[] initiative,double[] pot, int positionIchh, int[]handKartenn,int[]feldKartenn, double[][]einsatzz) {
		 	sieg=siegg;
		 	sie=new String[siegg.size()]; // weils mit ArrayList nicht läuf
		 	for(int i=0;i<siegg.size();i++){
		 		sie[i]=siegg.get(i);
		 	}
		 	sier=new String[siegerr.size()];// weils mit ArrayList nicht läuf
		 	for(int i=0;i<siegerr.size();i++){
		 		sier[i]=siegerr.get(i);
		 	}
		 	sieger=siegerr;
		 	gewinn=gewin;
			habe=habe2;
			anzahlSpielerr=anzahlSpieler;
			anzahlSpielerGenau=anzahlSpielerrGenau;
			feldkartenn=feldkartennn;
			flush=flushh;
			straight=straightt;
			zahlenverhaeltnis=zahlenverhaeltnis2;
			initiativee=initiative;
			pott=pot;
			positionIch=positionIchh;
			handKarten=handKartenn;
			feldKarten=feldKartenn;
			einsatz=einsatzz;
	 }
public static void main(String[] args) throws Throwable {
		FileOutputStream fs = new FileOutputStream("D:\\ULTRABOOK - Eigene Dateien\\Desktop\\file\\serialisierung\\seri.ser");
		ObjectOutputStream os = new ObjectOutputStream(fs);
	 	Einlesen.inn=new FileReader("D:\\LION's LAB\\Neuer Ordner\\Lionothos\\1.txt");
 		Einlesen.in=new BufferedReader(Einlesen.inn);
 		Einlesen.in.mark(20000000);
 		
 		int zahl=0;
 		String z=null;
 		while((z=Einlesen.in.readLine()).contains("ENDE")==false){
 			Einlesen.zeilenGesammt++;
// 			System.out.println(Einlesen.zeilenGesammt);
 			if(z.contains("10-max Platz")){
 				zahl++;
 			}
 		}
 		int zz=2;
 		int counter=0;
 		while(1==1){
 	 		int count=Einlesen.auswerten(zz);
// 	 		count=Einlesen.auswerten(zz);
 	 		if(count==0){
 	 			System.out.println("0");
 	 			break;
 	 		}if(count==1){
 	 			System.out.println("1");
 	 		}else{
 	 			zz=count+1;
 	 			Schreiben object=new Schreiben(Einlesen.sieg, Einlesen.sieger, Einlesen.anzahlSpielerGenau, Einlesen.win, Einlesen.habe, Einlesen.anzahlSpielerr, Einlesen.feldkartenn, Einlesen.flush, Einlesen.straight, Einlesen.zahlenverhaeltnis, Einlesen.initiativee, Einlesen.pott, Einlesen.positionIch, Einlesen.handKarten, Einlesen.feldKarten,Einlesen.einsatz);
 	 			os.writeObject(object);
 	 			counter++;
 	 			System.out.println(zz+"	"+object.sieg.toString()+"	"+object.sieger.toString());
 	 		}
 		}
 		os.close();
 		System.out.println("zahl"+zahl);
 		System.out.println("counter"+counter);
 		System.out.println("Fertig");
	}
hier die Serialisierung


Java:
public static ArrayList<Schreiben> auswertenAktuellesSpielLaden() throws Throwable{
		Schreiben obje;
		ArrayList<Schreiben> serid=new ArrayList<Schreiben>();
		ArrayList<Schreiben> list=new ArrayList<Schreiben>();

		FileInputStream fs = new FileInputStream("D:\\ULTRABOOK - Eigene Dateien\\Desktop\\file\\serialisierung\\seri.ser");
		ObjectInputStream is = new ObjectInputStream(fs);
			int counter=0;
		try{
			while(true){
				obje=(Schreiben)is.readObject();
				System.out.println(object.sieg.toString()+"	"+object.sieger.toString());
	 			serid.add(obje);
				counter++;
			}
		}catch(EOFException e){}
		is.close();
		System.out.println(counter);
		System.out.println(serid.size());
		System.out.println("GELADEN");
		return serid;
	}
hier der Aufruf

Beim Serialisieren werden die werte richtig ausgegeben. Beim Aufruf, hingegen wird überall der Wert vom ersten Wert ausgegeben und er ist auch beim debuggen so bei den Objekten abgespeichert.

Ich vermute, dass man irgendwie ArrayLists anderes Serialisieren muss, nur finde ich dazu iwie nix gescheids und es kommt mir auch komisch vor dass zumindest ein wert richtig gespeichert wird.
Die String[] sie und sier haben übrigens die richtigen werte.

Vielen Dank im vorraus
Grüße Noil
 
Zuletzt bearbeitet:

Joose

Top Contributor
Java:
public class Schreiben implements Serializable{
	public ArrayList<String> sieger=new ArrayList<String>();
	public String[]sie;
	public String[]sier;
	public ArrayList<String> sieg=new ArrayList<String>();
	public Object[]habe;
	public int[]anzahlSpielerGenau;
	public int[]anzahlSpielerr;
	public int[][]feldkartenn;
	public int[][]flush;
//	 static int[][]strasse;
	public Object[] zahlenverhaeltnis;
	public int[] initiativee;
	public int[][]straight;
	public double[] pott;
	public int positionIch;
	public int[] handKarten;
	public int[] feldKarten;
	public double[][]einsatz;
	public double gewinn;
	
	 ArrayList<Object> list=new ArrayList<Object>();

Bei solchen Klassenmonstern würde ich raten dein Design zu überlegen, probiere diese Daten auf mehrere Klasse aufzuteilen usw.
Der Vorteil davon ist einfach eine bessere Übersicht und Fehler können besser gesucht bzw. gefunden werden.

Außerdem sind Klassen normalerweise "Baupläne" von Dingen, daher ist "Schreiben" kein guter Name für dieser Klasse. ("DatenSchreiber" wäre schon besser, aber besser geht fast immer :p)
Methoden sollten dann Namen mit Verben bekommen. ("schreibeDaten" wäre da passend, oder nur "schreibe")

Java:
	 public Schreiben(ArrayList<String> siegg, ArrayList<String> siegerr, int[]anzahlSpielerrGenau, double gewin, Object[] habe2,int[]anzahlSpieler,int[][]feldkartennn,int[][]flushh,int[][]straightt,Object[] zahlenverhaeltnis2,int[] initiative,double[] pot, int positionIchh, int[]handKartenn,int[]feldKartenn, double[][]einsatzz) {
		 	sieg=siegg;
		 	sie=new String[siegg.size()]; // weils mit ArrayList nicht läuf
		 	for(int i=0;i<siegg.size();i++){
		 		sie[i]=siegg.get(i);
		 	}
		 	sier=new String[siegerr.size()];// weils mit ArrayList nicht läuf
		 	for(int i=0;i<siegerr.size();i++){
		 		sier[i]=siegerr.get(i);
		 	}
		 	sieger=siegerr;
		 	gewinn=gewin;
			habe=habe2;
			anzahlSpielerr=anzahlSpieler;
			anzahlSpielerGenau=anzahlSpielerrGenau;
			feldkartenn=feldkartennn;
			flush=flushh;
			straight=straightt;
			zahlenverhaeltnis=zahlenverhaeltnis2;
			initiativee=initiative;
			pott=pot;
			positionIch=positionIchh;
			handKarten=handKartenn;
			feldKarten=feldKartenn;
			einsatz=einsatzz;
	 }

Anstatt bei allen Parametern einfach nur einen Buchstaben zuändern solltest du mit "this" arbeiten:
Java:
public class Auto {
   private String farbe;
   public Auto(String farbe) {
      this.farbe = farbe;
   }
}

Java:
	 while(1==1){

Solche Endlosschleofen solllte man vermeiden und stattdessen mit einer "richtigen" Abbruchbedingung arbeiten :)

Java:
			while(true){
....
			}
		}catch(EOFException e){}

Hier gilt das Gleiche wie oben: Arbeite mit richtigen Abbruchbedingungen!
Eine Exception sollte nicht zur Ablaufsteuerung verwendet werden so wie hier.

Java:
 	 		int count=Einlesen.auswerten(zz);

......
 	 			Schreiben object=new Schreiben(Einlesen.sieg, Einlesen.sieger, Einlesen.anzahlSpielerGenau, Einlesen.win, Einlesen.habe, Einlesen.anzahlSpielerr, Einlesen.feldkartenn, Einlesen.flush, Einlesen.straight, Einlesen.zahlenverhaeltnis, Einlesen.initiativee, Einlesen.pott, Einlesen.positionIch, Einlesen.handKarten, Einlesen.feldKarten,Einlesen.einsatz);
 	 			os.writeObject(object);

Wie ich sehe ist die Klasse Einlesen, statisch Aufgebaut. Das wäre schon mal eine mögliche Fehlerquelle.
Werden in der Klasse Einlesen die ArrayList jedesmal neu initialisiert oder nur gecleart?
 
Zuletzt bearbeitet:

noil

Gesperrter Benutzer
Also zu dem Klassenmonster stimme ich zu, aber es geht schon gut so. Sind ja auch einfach nur viele Variablen, die wenn man sich da einliest schon gut im Überblick hat.
Mit der richtigen benennung hat ichs noch nie so und ich habe ehrlich gesagt mit einem Monsterprojekt angefangen zu programmieren und mir jetzt fürs nächste mal vorgenommen des alles besser zu machen, aber hatte keinen Bock des jetzt alles überall zu ändern. Danketrotzdem, übersicht ist schleißlich des a und o beim programmieren.
Das mit this. ist richtig, danke; hatte die anfangs statisch und da ging des dann mit this nicht^^, ja ist auch nicht so schön aber war halt so :D
Zu den Endlosschleifen break ist doch ne richtige Abbruchbedingung ;P , ne weiß schon was du meinst.
Hier gilt das Gleiche wie oben: Arbeite mit richtigen Abbruchbedingungen!
Eine Exception sollte nicht zur Ablaufsteuerung verwendet werden so wie hier.
Also ehrlich gesagt habe ich in Foren gesucht wie man alle Objekte einer .ser einlesen kann wenn man nicht weiß wie viele es sind und es wurde in allen Foren gesagt, dass des der einfachste Weg ist und man die Exception genau dafür sehr gut verweden kann. Wenn du da was weißt wies anders geht, bin ich für Verbesserungsvorschläge offen und würde mich sehr freuen.

Die ArrayLists werden nur gecleart, aber wenn da des Problem ist, wieso werden mir dann bei der Serialisierung die richtigen werte ausgegeben. Und bei der Deserialisierung die Werte von der ERSTEN und nicht die Werte von der letzten ausgegeben? bei static könnte es meinem bescheidenen Wissen nach ja eher so sein, dass die Werte vom letzten überall drinn stecken würden?

Falls es hilft bei "Einlesen.auswerten(zz);" sind am Ende auch die korrekten Werte in den ArrayLists drinnen. Es ist wirklich nur beim Auslesen der .ser und auch nur bei den ArrayLists.

Grüße Noil
 

Joose

Top Contributor
... die wenn man sich da einliest schon gut im Überblick hat.

Klar bei kleinere bzw. privaten Projekten nicht so schlimm.
Aber du musst bedenken, wenn du mal Hilfe brauchst und jemanden den Code zeigst soll dieser auch ohne große Schwierigkeiten sich zurecht finden ;)
Es gibt natürlich auch welche sich die Mühe machen und sich einlesen, aber eben nicht alle.

Mit der richtigen benennung hat ichs noch nie so und ich habe ehrlich gesagt mit einem Monsterprojekt angefangen zu programmieren und mir jetzt fürs nächste mal vorgenommen des alles besser zu machen, aber hatte keinen Bock des jetzt alles überall zu ändern.

Mit Hilfe einer IDE (siehe Eclipse, Netbeans, IntelliJ, ...) ist es möglich solche Sachen mit ein paar Klicks an allen Stellen zu Ändern.

Zu den Endlosschleifen break ist doch ne richtige Abbruchbedingung ;P , ne weiß schon was du meinst.

Für kleine Programme um etwas zu testen ist es sicher nicht schlimm.
Aber sobald man mit Threads arbeitet sollten wirklich "richtige" Abbruchbedingungen verwendet werden, und wer früh übt gewöhnt sich dran :)

Die ArrayLists werden nur gecleart, aber wenn da des Problem ist, wieso werden mir dann bei der Serialisierung die richtigen werte ausgegeben. Und bei der Deserialisierung die Werte von der ERSTEN und nicht die Werte von der letzten ausgegeben? bei static könnte es meinem bescheidenen Wissen nach ja eher so sein, dass die Werte vom letzten überall drinn stecken würden?

Falls es hilft bei "Einlesen.auswerten(zz);" sind am Ende auch die korrekten Werte in den ArrayLists drinnen. Es ist wirklich nur beim Auslesen der .ser und auch nur bei den ArrayLists.

Das klingt nach der Ursache. Die Liste ist nichts anderes als ein Objekt, diese weist du einem Objekt der Klasse "Schreiben" zu. Die Ausgabe stimmt dann auch :)
Beim nächsten "auswerten" clearst du diese Liste (sprich im alten Objekt der Klasse "Schreiben" ist die Liste nun auch leer) und fügst das gleiche Objekt wie vorher einem anderen Objekt der Klasse "Schreiben" hinzu.
Am Ende verwendest du für jedes Objekt der Klasse "Schreiben" das gleiche ArrayList-Objekt.
(kleiner Tipp, speichere deine Erstellten Objekte alle in einer Liste und statt immer nur die Liste des aktuellen Objektes auszugeben, lasse dir immer alle ausgeben ;) dann wirst du den Effekt selber bemerken.
Damit sollte klar sein warum bei der Serialisierung alle OK ausschaut.

Bei der Deserialisierung bin ich mir nicht ganz sicher: Ich nehme an da alle "Schreiben" Objekte die gleiche ArrayList verwenden wird diese beim Deserialisern der Objekte immer nur um die Einträge ergänzt.
Hier wäre es praktisch dir zu Beginn auch noch die Größe der ArrayList auszugeben.
 
Zuletzt bearbeitet:

noil

Gesperrter Benutzer
Klar bei kleinere bzw. privaten Projekten nicht so schlimm.
Aber du musst bedenken, wenn du mal Hilfe brauchst und jemanden den Code zeigst soll dieser auch ohne große Schwierigkeiten sich zurecht finden ;)
Es gibt natürlich auch welche sich die Mühe machen und sich einlesen, aber eben nicht alle.

Hahaahahaha, ja stimmt wohl^^


Mit Hilfe einer IDE (siehe Eclipse, Netbeans, IntelliJ, ...) ist es möglich solche Sachen mit ein paar Klicks an allen Stellen zu Ändern.

Naja, ich hab da noch so Probleme mit gleichen Namen in unterschiedlichen packages, ist zeimlich durcheinander, deshalb wie gesagt nächstes mal.


Das klingt nach der Ursache. Die Liste ist nichts anderes als ein Objekt, diese weist du einem Objekt der Klasse "Schreiben" zu. Die Ausgabe stimmt dann auch :)
Beim nächsten "auswerten" clearst du diese Liste (sprich im alten Objekt der Klasse "Schreiben" ist die Liste nun auch leer) und fügst das gleiche Objekt wie vorher einem anderen Objekt der Klasse "Schreiben" hinzu.
So von der Logik müssten, dann aber doch alle den wert vom letzten Objekt habe, oder? Ich meine Liste in Objekt 1(var1) wird gesetzt. Dann wird sie gecleart. var1 ist also null. Jetzt setzte ich var2 mit dem richtigen wert---> var1 und var2 sind jetzt gleich dem neuen Wert. Solange bis man zum Ende kommt. Jetzt sind alle var1-varN gleich dem letzten wert?

Noch ne Frage. Wenn ich Objekte bereits abgespeichert habe, kann man sie also noch verändern? sie sind, also erst dann unveränderlich wenn ich den OutputStream.close() mache?

Bei Einlesen.auswerten():
Java:
 		einsatz=new double[19][10];
 		positionIch=0;
 		handkarten="";
 		feldkarten="";
 		sieg.clear();
 		sieger.clear();
 		win=0;
müssten, dann handkarten, feldkarten, win und positionIch nicht auch immer gleich sein? Ich will jetzt nicht nerven oder so, aber ich würde es einfach gerne für mich verstehen und nicht nur so wissen.

Aber ich printe ja schon immer die ganze vorhandene ArrayList aus, also müsste es wenn es nur ergänzt wird mir doch jedes mal eine um 1 längere List ausprinten?

Java:
 		ArrayList<Object> kontrollListe=new ArrayList<Object>();
 		while(1==1){
 	 		int count=Einlesen.auswerten(zz);
// 	 		count=Einlesen.auswerten(zz);
 	 		if(count==0){
 	 			System.out.println("0");
 	 			break;
 	 		}if(count==1){
 	 			System.out.println("1");
 	 		}else{
 	 			zz=count+1;
 	 			Schreiben object=new Schreiben(Einlesen.sieg, Einlesen.sieger, Einlesen.anzahlSpielerGenau, Einlesen.win, Einlesen.habe, Einlesen.anzahlSpielerr, Einlesen.feldkartenn, Einlesen.flush, Einlesen.straight, Einlesen.zahlenverhaeltnis, Einlesen.initiativee, Einlesen.pott, Einlesen.positionIch, Einlesen.handKarten, Einlesen.feldKarten,Einlesen.einsatz);
 	 			os.writeObject(object);
 	 			counter++;
 	 			kontrollListe.add(object.sieger);
 	 			for(Object s:kontrollListe){
 	 				System.out.print(s.toString()+"	");
 	 			}
hab des mit der Liste jetzt mal so gemacht wie du des Vorgeschlagen hast, zumindest so wie ich verstanden habe dass du des meintest :D
Als Ausgabe kriege ich jetzt so wie oben vermutet, an allen Stellen das letzte Objekt ausgegeben.

Vielen Dank, dass du so viel Zeit opferst um mir zu helfen.
Grüße Noil
 
Zuletzt bearbeitet:

Joose

Top Contributor
Nein bei positionIch handelt es sich um einen primitiven Datentyp da wird direkt mit Werten gearbeitet nichtit Referenzen wie bei Objekten.
Bei Handkarten bzw. Feldkarten arbeitest du mit Strings. Diese sind immutable (unveränderbar).
Sprich du kannst ein bestehendes String Objekt nicht verändern, sondern nur neue erzeugen. Mit="" erzeugt du ein neues String Objekt

(Wenn ich zuhause bin werde ich noch Beispiele liefern ;))
 

noil

Gesperrter Benutzer
Genau so eine Antwort habe ich mir gewünscht, danke. Gibt es außer primitiven Datentypen und Strings noch solche Typen?

hab noch was editiert, weil du da noch nicht geantwortet hattest. Schau die des bitte nochmal an.

So erzeuge jetzt neue Objekte bei Einlesen.auswerten() und jetzt funzts.

Danke schonmal soweit, aber wenn du kannst bitte noch die anderen Fragen beantworten. (soll sich jetzt nicht undankbar anhören :D)
 
Zuletzt bearbeitet:

Joose

Top Contributor
Freut mich das ich helfen konnte :)

So von der Logik müssten, dann aber doch alle den wert vom letzten Objekt habe, oder? Ich meine Liste in Objekt 1(var1) wird gesetzt. Dann wird sie gecleart. var1 ist also null. Jetzt setzte ich var2 mit dem richtigen wert---> var1 und var2 sind jetzt gleich dem neuen Wert. Solange bis man zum Ende kommt. Jetzt sind alle var1-varN gleich dem letzten wert?


Noch ne Frage. Wenn ich Objekte bereits abgespeichert habe, kann man sie also noch verändern? sie sind, also erst dann unveränderlich wenn ich den OutputStream.close() mache?

Achtung: Du musst unterscheiden zwischen Objekt im Speicher und den serialisierten Daten der Datei!
Durch die Serialisierung wird das Objekt in die Datei geschrieben, das Objekt selber kannst du danach immer noch bearbeiten. Das ändert aber die serialisierten Daten nicht!

Sprich du hast x Einträge in einer Liste, serialisiert diese. Danach löscht du alle Einträge, die Datei mit dem serialisierten Objekt wird dadurch nicht geändert. Sprich wenn du diese Datei deserialisierst bekommst du eine Liste mit x Einträgen.

Aber ich printe ja schon immer die ganze vorhandene ArrayList aus, also müsste es wenn es nur ergänzt wird mir doch jedes mal eine um 1 längere List ausprinten?

hab des mit der Liste jetzt mal so gemacht wie du des Vorgeschlagen hast, zumindest so wie ich verstanden habe dass du des meintest :D
Als Ausgabe kriege ich jetzt so wie oben vermutet, an allen Stellen das letzte Objekt ausgegeben.

Beim Serialisieren könnte man das Problem auch nicht beobachten, da die Liste von dir ja immer gecleart wurde.
Beim Einlesen wäre es interessant gewesen, dort hätte von jedem neuem eingelesenen Objekt die Liste "sieg" immer mehr Einträge haben müssen als das Objekt davor.
 

noil

Gesperrter Benutzer
Achtung: Du musst unterscheiden zwischen Objekt im Speicher und den serialisierten Daten der Datei!
Durch die Serialisierung wird das Objekt in die Datei geschrieben, das Objekt selber kannst du danach immer noch bearbeiten. Das ändert aber die serialisierten Daten nicht!

Sprich du hast x Einträge in einer Liste, serialisiert diese. Danach löscht du alle Einträge, die Datei mit dem serialisierten Objekt wird dadurch nicht geändert. Sprich wenn du diese Datei deserialisierst bekommst du eine Liste mit x Einträgen.



Java:
zz=count+1;
 	 			Schreiben object=new Schreiben(Einlesen.sieg, Einlesen.sieger, Einlesen.anzahlSpielerGenau, Einlesen.win, Einlesen.habe, Einlesen.anzahlSpielerr, Einlesen.feldkartenn, Einlesen.flush, Einlesen.straight, Einlesen.zahlenverhaeltnis, Einlesen.initiativee, Einlesen.pott, Einlesen.positionIch, Einlesen.handKarten, Einlesen.feldKarten,Einlesen.einsatz);
 	 			os.writeObject(object);
 	 			counter++;
 	 			System.out.println(zz+"	"+object.sieg.toString()+"	"+object.sieger.toString());
 	 		}
Nur zum Verständnis: Hier erzeuge ich ein Objekt, serialisiere dieses, und lasse mir dann seine Werte ausgeben (die bei dieser Ausgabe vollkommen korrekt sind und schon immer waren) richtig?
Ein verändern des Objektes im nachhinein, bzw eines seiner Parameter sollte, also eigetnlich keinen einfluss mehr auf die serialiserten Dateien haben?


Beim Serialisieren könnte man das Problem auch nicht beobachten, da die Liste von dir ja immer gecleart wurde.
Beim Einlesen wäre es interessant gewesen, dort hätte von jedem neuem eingelesenen Objekt die Liste "sieg" immer mehr Einträge haben müssen als das Objekt davor.
Java:
int zz=2;
 		int counter=0;
 		while(1==1){
 	 		int count=Einlesen.auswerten(zz);
// 	 		count=Einlesen.auswerten(zz);
 	 		if(count==0){
 	 			System.out.println("0");
 	 			break;
 	 		}if(count==1){
 	 			System.out.println("1");
 	 		}else{
 	 			zz=count+1;
 	 			Schreiben object=new Schreiben(Einlesen.sieg, Einlesen.sieger, Einlesen.anzahlSpielerGenau, Einlesen.win, Einlesen.habe, Einlesen.anzahlSpielerr, Einlesen.feldkartenn, Einlesen.flush, Einlesen.straight, Einlesen.zahlenverhaeltnis, Einlesen.initiativee, Einlesen.pott, Einlesen.positionIch, Einlesen.handKarten, Einlesen.feldKarten,Einlesen.einsatz);
 	 			os.writeObject(object);
 	 			counter++;
 	 			System.out.println(zz+"	"+object.sieg.toString()+"	"+object.sieger.toString());
 	 		}
 		}
Aber ich benutzte doch Einlesen.auswerten() jedes mal neu, um die Werte für mein Objekt zu setzten. Dort clreare() ich auch "sieg". Also müsste meinem Verständnis nach "sieg" für jedes Objekt wieder bei null anfangen, da gecleart(). Dann neu bestückt werden und diese neuen Daten dann als neues Objekt serialisiert werden, was eine Veränderung unmöglich macht. Erst jetzt wird "sieg" wieder gecleart.
Oder ist es nur im Speicher solange bis ich os.close() mache? Und erst anch os.close() "Serialisiert"?

Ich denke jetzt mal es ist immernoch alles im Speicher:
Dann müsste doch bei jedem sieg.clear(), "sieg" in allen Objekten im Speicher==null sein?
Wenn ich es jetzt also neu bestücke müssten dann alle Objekte die neueste und nicht die älteste(erste) zuweisung haben? (zur Erinnerung wenn ichs nicht richtig erwähnt habe, es haben alle Objekte die Werte der ersten Zuweisung nicht der Letzten)

Vermutlich steh ich auf, dem Schlauch und es ist alles ganz logisch, aber ich verstehe es iwie nicht,noch nicht^^, also gib die Hoffnung bitte noch nicht auf ;P
Grüße Noil
 

Joose

Top Contributor
Nur zum Verständnis: Hier erzeuge ich ein Objekt, serialisiere dieses, und lasse mir dann seine Werte ausgeben (die bei dieser Ausgabe vollkommen korrekt sind und schon immer waren) richtig?
Ein verändern des Objektes im nachhinein, bzw eines seiner Parameter sollte, also eigetnlich keinen einfluss mehr auf die serialiserten Dateien haben?

Genau, die Änderungen betreffen nur das Objekt im Speicher!

Aber ich benutzte doch Einlesen.auswerten() jedes mal neu, um die Werte für mein Objekt zu setzten. Dort clreare() ich auch "sieg". Also müsste meinem Verständnis nach "sieg" für jedes Objekt wieder bei null anfangen, da gecleart(). Dann neu bestückt werden und diese neuen Daten dann als neues Objekt serialisiert werden, was eine Veränderung unmöglich macht. Erst jetzt wird "sieg" wieder gecleart.
Oder ist es nur im Speicher solange bis ich os.close() mache? Und erst anch os.close() "Serialisiert"?

Serialisiert ist serialisiert, diese Daten könnten sicher noch mit irgendwelchen "Tricks" manipuliert werden usw.
Aber nicht indem ich das eigentliche Objekt aus dem die Daten erzeugt wurden ändere.

Dann müsste doch bei jedem sieg.clear(), "sieg" in allen Objekten im Speicher==null sein?
Wenn ich es jetzt also neu bestücke müssten dann alle Objekte die neueste und nicht die älteste(erste) zuweisung haben? (zur Erinnerung wenn ichs nicht richtig erwähnt habe, es haben alle Objekte die Werte der ersten Zuweisung nicht der Letzten)

Es ist etwas kompliziert zu beschreiben, außerdem ist es nur meine Vermutung ;)

Du liest Daten ein und erzeugst ein Schreiben Objekt (nennen wir es A). A hat eine Liste (L) für "sieg" gesetzt bekommen und wird dann serialisiert. (es passieren die ausgaben von A -> korrekt)
Du liest Daten ein und erzeugst ein Schreiben Objekt (nennen wir es B). B hat eine Liste (L) für "sieg" gesetzt bekommen und wird dann serialisiert. (es passieren die ausgaben von A -> korrekt)
Beide Schreiben Objekte haben das gleiche Listen Objekt gesetzt bekommen und diese Information das es sich um das Objekt L handelt wurde ebenfalls serialisiert.

Sprich in der Datei X stehen jetzt Daten drinnen die das Objekt A beschreiben, mit der Liste L und 4 Einträgen. Weiters stehen in der Datei X Daten drinnen die das Objekt B beschreiben, ebenfalls mit der Liste L und 3 anderen Einträgen.

Beim Deserialisieren weiß Java das vorher für alle Schreiben Objekte das gleiche Listen Objekt verwendet wurde. Daher wird eben auch bei der Deserialisierung für jedes Objekt die gleiche Liste verwendet.
Für Objekt A werden dann 4 Einträge in die Liste geladen, für Objekt B werden dann weitere 3 Einträge in die Liste geladen.

EDIT: Vielleicht fällt mir noch ein besseres/einfacheres Beispiel ein, was glaub ich passiert bei der Deserialisierung dieser Objekte
 
Zuletzt bearbeitet:

noil

Gesperrter Benutzer
Du liest Daten ein und erzeugst ein Schreiben Objekt (nennen wir es A). A hat eine Liste (L) für "sieg" gesetzt bekommen und wird dann serialisiert. (es passieren die ausgaben von A -> korrekt)
Du liest Daten ein und erzeugst ein Schreiben Objekt (nennen wir es B). B hat eine Liste (L) für "sieg" gesetzt bekommen und wird dann serialisiert. (es passieren die ausgaben von A -> korrekt)

Du meinst die ausgabe von B? weil A wäre ja falsch.

Nochmal kurz nur damit ich ganz sicher bin. Sobald ich os.write() aufrufe ist die Datei serialisiert und nicht mehr ohne "Tricks" zu verändern? Ich muss nicht erst os.close() machen?

Beim Deserialisieren weiß Java das vorher für alle Schreiben Objekte das gleiche Listen Objekt verwendet wurde. Daher wird eben auch bei der Deserialisierung für jedes Objekt die gleiche Liste verwendet.
Für Objekt A werden dann 4 Einträge in die Liste geladen, für Objekt B werden dann weitere 3 Einträge in die Liste geladen.e

Des mit der gleichen Liste leuchtet mir irgendwo ein. Aber kannst du den letzten Teil nochmal erklären? Dann müsste wenn ich die Liste ausgeben lasse, für Objekt B ja 7 elemente ausgegeben werden?
 

Joose

Top Contributor
Du meinst die ausgabe von B? weil A wäre ja falsch.

Ja ich meine in der 2.Zeile natürlich B ..... Copy&Paste usw. ;)

Nochmal kurz nur damit ich ganz sicher bin. Sobald ich os.write() aufrufe ist die Datei serialisiert und nicht mehr ohne "Tricks" zu verändern? Ich muss nicht erst os.close() machen?

Ja dein Objekt ist serialisiert und exstiert nur noch als Stream. Die Daten können jetzt schon in der Datei stehen oder sie werden erst beim Aufruf von "flush()" in die Datei geschrieben.
(Der Stream kann internt eine begrenzte Anzahl an bytes[] speichern soweit ich weiß. Ist er voll wird "flush()" automatisch aufgerufen).
Die Methode "close()" ruft intern ebenfalls "flush()" auf.

Des mit der gleichen Liste leuchtet mir irgendwo ein. Aber kannst du den letzten Teil nochmal erklären? Dann müsste wenn ich die Liste ausgeben lasse, für Objekt B ja 7 elemente ausgegeben werden?

Genau das würde ich mir denken, daher meinte ich aus lass dir die Länge der Liste ausgeben beim Deserialisieren.
 

noil

Gesperrter Benutzer
Also Danke vielmals.
Läuft jetzt alles soweit, vllt probier ich die nächsten Tage mal des mit der size(), dann werde ichs hier noch reinposten.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M ArrayList oder LinkedList Allgemeine Java-Themen 10
C Sortieren und Selektieren einer ArrayList<Point3D> Allgemeine Java-Themen 6
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
T Remove bei ArrayList funktioniert nicht Allgemeine Java-Themen 2
B Type mismatch: cannot convert from Graph.Edge to ArrayList<Graph.Edge> Allgemeine Java-Themen 21
R ArrayList Allgemeine Java-Themen 4
G jToggleButton in Array/ArrayList Allgemeine Java-Themen 12
J ArrayList, ganze Zeilen löschen oder überspringen Allgemeine Java-Themen 4
L ArrayList sortieren Allgemeine Java-Themen 2
C ArrayList Problem Allgemeine Java-Themen 3
O Datentypen Wie kann ich den Typ einer ArrayList abfragen ? Allgemeine Java-Themen 7
S Best Practices CopyConstrutor mit ArrayList Allgemeine Java-Themen 1
S ArrayList Design Allgemeine Java-Themen 4
S Array dynamisieren oder ArrayList verwenden? Allgemeine Java-Themen 17
L ArrayList mit String Arrays in ein Array umwandeln Allgemeine Java-Themen 1
H Elemente aus ArrayList in Array speichern Allgemeine Java-Themen 8
MiMa Person in einer Arraylist hinzugügen mit Prüfung ? Allgemeine Java-Themen 6
X Adjazenzliste ohne ArrayList Allgemeine Java-Themen 6
X Output von ArrayList Allgemeine Java-Themen 3
H Stream in ArrayList umwandeln Allgemeine Java-Themen 2
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
H Arraylist mit anderer ArrayList überschreiben Allgemeine Java-Themen 17
MiMa ArrayList sortieren?? Allgemeine Java-Themen 5
Curtis_MC Pointer mit ArrayList vergleichen Allgemeine Java-Themen 6
F ArrayList`s in Klassen mit Getter/Setter Allgemeine Java-Themen 8
W Array vs. ArrayList vs. HashMap Allgemeine Java-Themen 20
F Arraylist vollständig abspeichern und laden Allgemeine Java-Themen 1
R Arraylist in andere Klasse leiten und bearbeiten Allgemeine Java-Themen 10
D ArrayList Indexlänge ändern Allgemeine Java-Themen 2
E Elemente innerhalb einer ArrayList vergleichen Allgemeine Java-Themen 33
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
N Mehrdimensionale ArrayList mischen Allgemeine Java-Themen 10
S JTable - mehrere ausgewählte Rows in ArrayList Allgemeine Java-Themen 5
MiMa Date aus einer ArrayList<Date> holen ?? Allgemeine Java-Themen 5
MiMa ArrayList Rückgabewerte aus einer Funktion Allgemeine Java-Themen 15
L CSV File lesen, in ArrayList speichern und ausgeben Allgemeine Java-Themen 3
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
T Collections ArrayList Sortieren Allgemeine Java-Themen 4
P GUI: ArrayList anzeigen funktioniert nicht Allgemeine Java-Themen 5
H ArrayList: Leere Elemente finden? Allgemeine Java-Themen 2
GreenTeaYT Verständnisprobleme zur Arraylist Allgemeine Java-Themen 1
T Methoden Methode zum durchsuchen einer ArrayList Allgemeine Java-Themen 8
K ArrayList sortieren Allgemeine Java-Themen 16
A Bestimmte Inhalte aus ArrayList 1 in ArrayList 2 kopieren Allgemeine Java-Themen 6
S Mehrdimensionales ArrayList ins HashSet Allgemeine Java-Themen 10
C ArrayList Allgemeine Java-Themen 8
Streeber Probleme mit AWT-EventQueue: ArrayList Elemente hinzufügen Allgemeine Java-Themen 1
F Methoden Arraylist weiterverwenden nach methoden Aufruf Allgemeine Java-Themen 2
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
L Von ArrayList abgeleitete Klasse nur mit bestimmten Objekten füllen Allgemeine Java-Themen 1
K Array in ArrayList Allgemeine Java-Themen 16
Paul15 2D Arraylist in Jtable Allgemeine Java-Themen 1
Paul15 Arraylist 2D Allgemeine Java-Themen 8
B ArrayList in ein Objekt legen Allgemeine Java-Themen 1
Neumi5694 Datentypen ArrayList vs TreeMap Allgemeine Java-Themen 6
F ArrayList Allgemeine Java-Themen 11
X ArrayList will nicht so wie ich will. Hilfe Allgemeine Java-Themen 8
M ArrayList mit verschiedenen Datentypen in String konvertieren Allgemeine Java-Themen 10
Z Elemente einer ArrayList von rechts wegnehmen Allgemeine Java-Themen 5
W Arraylist Text Suchen und Datei löschen Allgemeine Java-Themen 5
R ArrayList und HashMap Allgemeine Java-Themen 7
T ArrayList zeilenumbruch entfernen Allgemeine Java-Themen 13
D Arraylist/For Schleife/Scanner Allgemeine Java-Themen 30
E ArrayList Anzahl der gleichen Elemente Allgemeine Java-Themen 4
Doopy ArrayList plötzlich leer Allgemeine Java-Themen 2
D Arraylist eigener Klasse an iReport übergeben Allgemeine Java-Themen 7
L ArrayList Inhaltstyp. Allgemeine Java-Themen 5
Z Klassen ArrayList selbst machen Allgemeine Java-Themen 5
J Arraylist speichern und laden? Allgemeine Java-Themen 5
C Generics Objekt in ArrayList Allgemeine Java-Themen 2
D ArrayList index auf gültigkeit prüfen Allgemeine Java-Themen 12
M ArrayList<String> Frage Allgemeine Java-Themen 7
O ArrayList kaputt?! Allgemeine Java-Themen 5
M ArrayList<Foo> in ein Foo[] konvertieren? Allgemeine Java-Themen 8
Bananabert Abstract ArrayList Allgemeine Java-Themen 4
A Collections Array-Elemente in ArrayList kopieren ohne Schleife Allgemeine Java-Themen 7
O ArrayList - Serialisierungs-Problem Allgemeine Java-Themen 11
M JTable + ArrayList Allgemeine Java-Themen 3
M Datentypen ArrayList in Integer konvertieren Allgemeine Java-Themen 3
O Collections ListIterator gibt Inhalt von ArrayList nicht aus Allgemeine Java-Themen 3
Madlip Variablen 3 Werte aus ArrayList und weiter ... Allgemeine Java-Themen 4
S arraylist nach n. Eintrag numerisch Sortiren Allgemeine Java-Themen 5
O Problem beim Auslesen einer Arraylist von JComboBoxen Allgemeine Java-Themen 2
R Threads korrekte Synchronisation bei Vector und ArrayList Allgemeine Java-Themen 6
M Kovariante Rückgabewerte mit ArrayList Allgemeine Java-Themen 3
H LinkedList<LinkedList<String>> nach ArrayList<ArrayList<String>> ? Allgemeine Java-Themen 9
E NetBeans Vector durch ArrayList ersetzen Allgemeine Java-Themen 4
Maxim6394 Problem mit ArrayList Allgemeine Java-Themen 5
E Berechnung in Arraylist Allgemeine Java-Themen 10
E ArrayList mit unbekannter Größe Allgemeine Java-Themen 8
V Fork Join bei Arraylist Allgemeine Java-Themen 6
H Fehler in Arraylist Allgemeine Java-Themen 2
S Datensätze in eine ArrayList<Movie> speichern Allgemeine Java-Themen 13
S Alle Kombinationen aus ArrayList - Potenzmenge Allgemeine Java-Themen 7
V ArrayList vergleichen mit .equals? Allgemeine Java-Themen 13
J ArrayList-Problem Allgemeine Java-Themen 16
S Von einer ArrayList in die andere schreiben? Allgemeine Java-Themen 6
S ArrayList<JLabels> "malen" Allgemeine Java-Themen 4
E ArrayList in ArrayList, Referenzierungsproblem Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben