Deserialisierung EOF

Status
Nicht offen für weitere Antworten.

Shaddow

Mitglied
Hi, ich sitze gerade daran, ein Objekt einer Klasse zu serialisieren und nach ein wenig Debugging schient das jetzt auf fehlerfrei zu funktionieren:
Java:
		ObjectOutputStream objOut = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(path))); 
		objOut.writeObject(this); 
		objOut.close();

Wenn ich es wieder auslese, bekomme ich eine EOF Exception:
Java:
		ObjectInputStream objIn = new ObjectInputStream(new BufferedInputStream(new FileInputStream(path))); 
		GroundMap map = (GroundMap) objIn.readObject(); 
		objIn.close();	
		return map;

Hat da jemand eine Idee?
 
S

SlaterB

Gast
passiert das auch in folgendem Programm?
Java:
public class Test implements Serializable {

	public static void main(String argv[]) throws Exception {
		Test t = new Test();
		String path = "test.txt";
		ObjectOutputStream objOut = new ObjectOutputStream(
				new BufferedOutputStream(new FileOutputStream(path)));
		objOut.writeObject(t);
		objOut.close();

		ObjectInputStream objIn = new ObjectInputStream(
				new BufferedInputStream(new FileInputStream(path)));
		Object object = objIn.readObject();
		System.out.println(object);

	}

}
wenn bedauerlicherweise ja, hilft ein flush vor dem close?

wenn hoffentlich nein, dann liegts an irgendwas in deinem Programm ;)
 

Shaddow

Mitglied
Also der Code funkt. Aber wo könnte denn ein Fehler sein? Beim Speichern ist alles glatt gegangen kamen keine Fehler, alles ist Serializeable. Was kann dann beim Laden schief gehen?
 
S

SlaterB

Gast
ein möglicher Fehler ist, dass irgendjemand zwischendurch die Datei leert,
oder irgendwo ist ein Stream offen und verhindert das Speichern,

wozu aber raten, wenn man das Programm vorliegen hat..
 

Shaddow

Mitglied
Okay also ich glaube nicht, dass die Datei an irgendeiner anderen Stelle mal verwendet wird, zumindest nicht dass ich wüsste ^^
Aber mal zum Quellcode:

Java:
public class GroundMap implements Serializable
{	
	private GLRenderer glRenderer;
	
	private int width;
	private int height;
	
	private String defaultTexture;
	
	private Vector3f[][] gridData;
	private GLField[][] fields;
	
	private boolean randomize;
	
		
	public GroundMap(GLRenderer glRenderer, int width, int height, float fieldWidth, float fieldHeight, String defaultTexture, boolean randomized) 
	{
		this.glRenderer = glRenderer;
		
		this.width = width;
		this.height = height;
		
		this.randomize = randomize;
		
		this.defaultTexture = defaultTexture;

		gridData = new Vector3f[height+1][width+1];
		fields = new GLField[height][width];
	
		Random random = new Random();
		
		for (int i = 0; i <= height; i++)
			for (int j = 0; j <= width; j++)
				if (randomized)
					gridData[i][j] = new Vector3f(i*fieldHeight,(float)random.nextInt(100)/100,j*fieldWidth);
				else
					gridData[i][j] = new Vector3f(j,1,i+6);
		
		int counter = 0;
		
		for (int i = 0; i < height; i++)
			for (int j = 0; j < width; j++)
			{				
				fields[i][j] = new GLField(gridData[i][j], gridData[i+1][j], 
											gridData[i][j+1],gridData[i+1][j+1],
											counter,defaultTexture);
				glRenderer.glSelectionManager.add(fields[i][j]);
				counter++;
		}
	}
	
	public void save(String path) throws FileNotFoundException, IOException
	{
		ObjectOutputStream objOut = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(path))); 
		objOut.writeObject(this); 
		objOut.flush();
		objOut.close();		
	}
	
	public static GroundMap load(String path) throws FileNotFoundException, IOException, ClassNotFoundException
	{
		ObjectInputStream objIn = new ObjectInputStream(new BufferedInputStream(new FileInputStream(path))); 
		GroundMap map = (GroundMap) objIn.readObject(); 
		objIn.close();	
		return map;
	}
	

	
	public void draw(GL gl, GLU glu){}
	
	public void drawWireframe(GL gl, GLU glu){}
}

Java:
public class GLField implements ISelectable, Serializable
{	
	public Vector3f v1;
	public Vector3f v2;
	public Vector3f v3;
	public Vector3f v4;
	
	public Vector3f normal;
	
	public GLColor uniqueColor;
	
	public int ID;
	public String texture;	
	
	public boolean selected = false;
	public boolean hovered = false;
	
	public GLField (Vector3f v1, Vector3f v2, Vector3f v3, Vector3f v4, int ID, String texture)
	{
		this.v1 = v1;
		this.v2 = v2;
		this.v3 = v3;
		this.v4 = v4;
		
		recalculateNormals();
		
		
		this.ID = ID;
		this.texture = texture;
	}
[...]
}
 
S

SlaterB

Gast
noch einfacher ist natürlich, dass path beim Laden und Speichern nicht derselbe ist,
ein Programm ohne kompletten Programmfluss ist relativ sinnlos,

dennoch bietet sich auf hier abweichend von deinem normalen Ablauf ein Testprogramm der Form

String path = ..;
GroundMap x = ...;
x.save(path);
GroundMap.load(path);

an,
funktioniert das?
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben