Input/Output ObjectOutputStream putFields-Problem

Seikuassi

Aktives Mitglied
Hallo Forum-Nutzer,

habe ein kleines Problem mit dem ObjectOutputStream bzw. PutField:
Java:
public static void main(String[]arg){
	try{
		ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("/test.dat",false));
		ObjectOutputStream.PutField data_out=out.putFields(); // Fehler 
		
		data_out.put("section_0",(byte)50);
		out.writeFields();
		out.flush();
		out.close();
	}catch(Exception exc){
		exc.printStackTrace(); // Fehler ausgeben
		System.exit(-1); // Programm mit Fehlercode beenden
	}
	return;
}
Fehler:
Code:
java.io.NotActiveException: not in call to writeObject
	at java.io.ObjectOutputStream.putFields(ObjectOutputStream.java:459)
	at classes.Test.main(Test.java:5)
Frage:Wie löse ich das Problem? Oder habe ich putFields falsch verstanden? Ähnlich wie Properties möchte ich Daten speichern. Allerdings auch primitive Datentypen (int,char etc.).

Danke im Voraus!

Mit freundlichen Grüßen
Seikuassi
 
Die Kurzfassung: ja du hast putFields flasch verstanden, alledings ist das JavaDoc dazu nicht gerade selbsterklärend. Dir fehlt vermutlich das nötige Hintergrundwissen, und zwar folgendes:
ObjectOut/InputStream ist dazu gedacht Objekte (die das Serializable Interface implementieren) in einem speziellen Format zu speichern. Für die meisten Fälle reicht es, dass die Default-Implementierung dazu per Reflection die Instanzvariablen speichert und beim laden wieder setzt (es wird der Default-Konstruktor verwendet). Reicht das nicht, kann man in der Klasse private Methoden definieren die write bzw. read heißen müssen und einen ObjectOut/InputStream als Argument haben. Man kann auch nur eine von beiden implementieren (z.B. read und dann volatile Felder intialisieren). Die putFields Methode ist (genauso wie defaultWriteObject) dafür gedacht nur in dieser write Methode aufgerufen zu werden, die darüber gesetzten Werte werden dann in den Stream geschrieben, als ob es Instanzvariablen wären, die durch die default-Implementierung gespeichert würden.
 
Hallo Kevin94,

danke für deine Antwort. Na gut, dann nehme ich eben einen java.util.Hashtable<> und speichere diesen mit writeObject().
Stimmt es eigentlich, dass ObjectInput-/Outputstream langsamer ist als DataInput-/OutputStream? Und wenn ja, wie viele ms? Hat das einer von euch mal getestet?

Danke im Voraus!

Mit freundlichen Grüßen
Seikuassi
 

Neue Themen


Zurück
Oben