Objekt Listen serialisierung und deserialisieren

osion

Bekanntes Mitglied
Hallo 😛opcorn:

Also ich habe eine Klasse "belege", welcher jedesmal ein neues Objekt (also Beleg1,Beleg2) macht und dies in ein List<beleg> speichert. Bis dahin funktioniert alles.

Jedesmal wenn es in die Liste geschrieben hat, bekomme ich eine Consolenausgabe (size). Size vergrössert sich auch immer, solange das Programm läuft.

Mein Problem ist, dass nach dem deserialisieren size = 0 ist.

Wie die Datei aussieht wo ich das Objekt speichere:
13406533oy.jpg

Sereialisieren
Java:
public void belegeInfoSchreiben(belege belegInfo,List<belege> bestellungen ) {
	
	OutputStream fos = null;
	OutputStream fos2 = null;

	try {
		fos = new FileOutputStream("info.txt");
		ObjectOutputStream o = new ObjectOutputStream(fos);
		o.writeObject(belegInfo);
	} catch (IOException e) {
		System.err.println(e);
	} finally {
		try {
			fos.close();
		} catch (Exception e) {
		}
	}
	try {
		fos2 = new FileOutputStream("belege.txt");
		ObjectOutputStream a = new ObjectOutputStream(fos2);
		a.writeObject(bestellungen);
		
	} catch (IOException e) {
		System.err.println(e);
	} finally {
		try {
			fos2.close();
		} catch (Exception e) {
		}
	}
	}

Deserialisieren

Java:
public List<Object> belegeInfoLesen() {
	
	List<Object> lesenReturnLesen=new ArrayList<Object>();
	belege belegInfo = null;
	

	InputStream fis = null;
	InputStream fis2 = null;

	try {
		fis = new FileInputStream("info.txt");
		ObjectInputStream o = new ObjectInputStream(fis);
		belegInfo = (belege) o.readObject();

	} catch (IOException e) {
		System.err.println(e);
	} catch (ClassNotFoundException e) {
		System.err.println(e);
	} finally {
		try {
			fis.close();
		} catch (Exception e) {
		}
	}
	
	try {
	fis2 = new FileInputStream("belege.txt");
	ObjectInputStream a = new ObjectInputStream(fis2);
	List<belege> bestellungen = (List<belege>) a.readObject();
	} catch (IOException e) {
		System.err.println(e);
	} catch (ClassNotFoundException e) {
		System.err.println(e);
	} finally {
		try {
			fis2.close();
		} catch (Exception e) {
		}
	}
	lesenReturnLesen.add(belegInfo);
	lesenReturnLesen.add(bestellungen);
return lesenReturnLesen;

Die Methode wird hier beim Starten des Programm aufgerufen.
Java:
		lesenReturnLesen=belegInfoAnfang.belegeInfoLesen();
		belegInfo=(belege) lesenReturnLesen.get(0);
		bestellungen=(List<belege>) lesenReturnLesen.get(1);

Ich habe da jetzt Tagelang rumgetüfelt, aber ich weiss nicht warum er das nicht macht. Mein Problem ist halt auch, ich sehe ja nicht was er alles in die Datei wirklich schreibt.
 
Implementiert das Objekt zu "belege" auch Serializable?

Ansonsten mal grundsätzlich schauen wie gross "belege.txt" ist und ob das irgendwie zu der grösse der Objekte passt.

Grundsätzlich sollte das aber so wie Du es programmiert hast funktionieren (wenn ich nix übersehen habe).

Sollte Dein Programm jemals "draussen" ernsthaft in den Einsatz kommen, solltest Du dir ein anderes Speicherformat als serialisierung ausdenken.

Bernd
 
Sehe ich ähnlich, beim drüber schauen ist mir auch nichts aufgefallen was da falsch ist, wobei da auch Faktoren ne Rolle spielen könnten die vom Rest des Codes ausgehen.
Jedenfalls hier mal ein kleines isoliertes Beispiel wie es funktoniert. Ich hoffe es hilft ein wenig bei der Fehlersuche, wenn du einfach mal vergleichst was ich so mache und was du bei dir machst.

Java:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;


public class Beleg implements Serializable {
	
	private static ArrayList<Beleg> alleBelege = new ArrayList<>();
	
	private int foo;

	public Beleg(int foo) {
		this.foo = foo;
	}
	
	
	
	public static void main(String[] args) {
		
		for(int i = 0; i < 10; i++) {
			alleBelege.add(new Beleg(i));
		}
		
		try {
			saveListToFile(alleBelege, "/home/samu/Desktop/test123.ser");
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		ArrayList<Beleg> geladeneBelege = null;
		try {
			geladeneBelege = loadFromFile("/home/samu/Desktop/test123.ser");
		} catch (ClassNotFoundException | IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if(geladeneBelege != null) {
			System.out.println(geladeneBelege.size());
		} else {
			System.out.println("Irgendwas ist schief gelaufen.");
		}
		
		
	}
	
	private static void saveListToFile(Serializable toSave, String path) throws IOException {
		
		FileOutputStream file = new FileOutputStream(path);
		ObjectOutputStream o = new ObjectOutputStream(file);
		o.writeObject(toSave);
		o.close();
	}
	
	private static ArrayList<Beleg> loadFromFile(String path) throws IOException, ClassNotFoundException {
		
		ArrayList<Beleg> listToLoad = null;
		
		if(new File(path).exists()) {

			FileInputStream file = new FileInputStream(path);
			ObjectInputStream o = new ObjectInputStream(file);
			listToLoad = (ArrayList<Beleg>) o.readObject();
			o.close();

			return listToLoad;
		} else {
			return null;
		}

	}
	
}

Der Output der Größe der Derserialisierten Liste ist wie erwartet dann 10 hier in diesem Beispiel.

FYI: Code Conventions for the Java Programming Language

Grüße,
sMau
 
Zuletzt bearbeitet:
Implementiert das Objekt zu "belege" auch Serializable?

Ansonsten mal grundsätzlich schauen wie gross "belege.txt" ist und ob das irgendwie zu der grösse der Objekte passt.

Grundsätzlich sollte das aber so wie Du es programmiert hast funktionieren (wenn ich nix übersehen habe).

Sollte Dein Programm jemals "draussen" ernsthaft in den Einsatz kommen, solltest Du dir ein anderes Speicherformat als serialisierung ausdenken.

Bernd

Jo....Warum nicht serialisieren?


-----
Also ich habe festgestellt, dass jeder Eintrag bei List<belege> (der während der Laufzeit nicht der nach dem Deserialisieren) die gleiche Werte hat.

Mein Schluss er speichert die Objekte nicht vollständig in die Liste sondern nur Verweise jaaa?:idea:

Ich kann ja keine dynamischen Methoden machen und als List auch nicht abspeichern. Ne Idee?
 
Jo....Warum nicht serialisieren?

Du lieferst das Programm aus, die Kunden schreiben paar Belege weg. Jetzt änderst Du was an der Datenstruktur der Belege (zb. fügst noch ein Feld hinzu) oder fummelst eine Methode dazu und schwupps ist das inkompatibel zu dem, was die Kunden draussen auf ihrer Platte haben. Da gibts zwar paar Tricks, aber das ist halt Pflegeaufwand.

Also ich habe festgestellt, dass jeder Eintrag bei List<belege> (der während der Laufzeit nicht der nach dem Deserialisieren) die gleiche Werte hat.

Mein Schluss er speichert die Objekte nicht vollständig in die Liste sondern nur Verweise jaaa?:idea:

Ich kann ja keine dynamischen Methoden machen und als List auch nicht abspeichern. Ne Idee?

Wenn alle Objekte in der Liste gleich sind, hast Du bei einem neuen Beleg vergessen ein "beleg = new Beleg()" zu machen.

Bernd
 
Wenn alle Objekte in der Liste gleich sind, hast Du bei einem neuen Beleg vergessen ein "beleg = new Beleg()" zu machen.

Bernd

Nicht ganz. Wenn ich ein Objekt in der List speichere werden nur die Referenzen gespeichert, aber nicht das Objekt. Ich müsste schon clone (irgenwo hier gibt es einen Beitrag darüber).

Ich versuche es mal mit einer HasMap...

Wie würdet ihr das speichern, wenn ihr immer neue Belege erstellt und die abspeichern wollt?
 

Zurück
Oben