Java Beim einlesen einer Datei : StreamCorruptedException: invalid type code

#basTi

Commodore Pro
Registriert
Aug. 2005
Beiträge
4.763
Hallo zusammen,

ich habe folgende Situation: Ich habe ein Programm geschrieben das ein Object serialisiert und auch wieder einlesen kann.
Das funktioniert auch wunderbar doch bei einer Datei bekomme ich folgenden Fehler beim einlesen:
java.io.StreamCorruptedException: invalid type code: 30

Hab zwei Infos im Netz gefunden: Die Datei wird beim schreiben noch geändert (könnte bei mir der Fall sein, da das speichern in nem Thread ausgelagert wurde) [Link]oder weil der header öfters in die Datei geschrieben wird [Link] ...

Woher finde ich raus, was bei mir schief lief?

Und noch viel wichtiger: Kann ich das serialisierte Objekt irgendwie "fixen" um es doch einzulesen? Da sind sehr wichtige Infos drin, die sonst wieder neu erstellt werden müssten.

Mein Code:
Code:
public void storeFile(String file, Object obj) {
		OutputStream fos = null;

		try {
			fos = new FileOutputStream(file);
			ObjectOutputStream o = new ObjectOutputStream(fos);
			o.writeObject(obj);

		} catch (IOException e) {
			Logger.getLogger(MainModel.class.getName()).log(Level.WARNING, "Problem while serializing: {0}", e);
		} finally {
			try {
				if (fos != null) {
					fos.close();
				}
			} catch (Exception e) {
			}
		}
	}


Code:
private Object loadFile(String filePath) {
		FileInputStream fis = null;
		ObjectInputStream ois = null;

		try {
			fis = new FileInputStream(filePath);
			ois = new ObjectInputStream(fis);

			Object result = ois.readObject();
			ois.close();
			Logger.getLogger(Testwriter.class.getName()).log(Level.INFO, "{0} wurde gefunden.", filePath);
			return result;
		} catch (FileNotFoundException ex) {
			Logger.getLogger(Testwriter.class.getName()).log(Level.WARNING, "{0} nicht vorhanden", filePath);
		} catch (ClassNotFoundException ex) {
			Logger.getLogger(Testwriter.class.getName()).log(Level.WARNING, null, ex);
		} catch (IOException ex) {
			Logger.getLogger(Testwriter.class.getName()).log(Level.WARNING, null, ex);
		} finally {
			try {

				if (fis != null) {
					fis.close();
				}
				if (ois != null) {
					ois.close();
				}

			} catch (IOException ex) {
				Logger.getLogger(Testwriter.class.getName()).log(Level.FINE, null, ex);
			} catch (NullPointerException ex) {
				Logger.getLogger(Testwriter.class.getName()).log(Level.FINE, null, ex);
			}
		}
		return null;
	}

Schonmal Danke im Voraus für eure Hilfe :)
 
Wo ist denn der threading code?
Da wäre interessant inwieweit du synchronisierst, um eben zu verhindern dass lesen und schreiben gleichzeitig passieren.
 
Keine Synchronisation ... hatte ich damals nicht dran gedacht beim speichern - shame on me.
Trotztdem rettbar oder Datenmüll?
 
`basTi schrieb:
Trotztdem rettbar oder Datenmüll?

Kann ich nicht beurteilen. Hängt sicher auch davon ab in welchem Format die Daten serialisiert wurden, ob (manuell) noch was lesbar ist.
Hast du die Datei mal in 'nem Hex editor angeschaut?
 
Ja habe ich. Nur ausserhalb des programms nützen sie mir leider nix :/
Serialisiert wird eine Wrapperklasse, welche zwei Objekte enthhält, wobei das eine eine u.a. eine LinkedList beinhaltet, welche dazu dient eine Hierarchie aufzuspannen.
Diesen "Baum" benötige ich wieder im Programm :/
 
Ich nehm jetzt mal an dass die Serilization auch in Java geschrieben ist. Falls ja könnte man sich den Code davon mal anschauen und versuchen das Ergebnis selbst zu errechnen und dann an der stelle wo es ihn aufstellt versuchen noch was zu retten.
Das würd ich aber nur machen wenns wirklich notwendig ist.

Bissl offtopic. Ich würde nicht die default serialisierung verwende. Die ist einfach elends langsam. Nutze eher sowas wie http://code.google.com/p/kryo/
 
Ich verwende die Standardserialisierung. Hab auch kein Problem mit dem Speed, da es hier immer nur um eine Datei zum Speichern/Laden geht und diese nicht sonderlich groß ist.
Aber danke für den Tipp (für die Zukunft :) )

Mal sehn ob ich das mit dem "Ergebnis selbst errechnen" hinbekomm ;)
 
Zurück
Oben