Problem beim serialisieren von komplexen Objekten (v.A. GregorianCalendar)

schneemensch

Grünschnabel
Hallo zusammen,

ich bin zur Zeit dabei für meine OOP Vorlesung ein Tool zur Milchviehverwaltung (ja, kein Scherz :) ) zu schreiben.
Die Viecher werden zu Beginn in unterschiedliche Vectoren eingelesen, dann vom Nutzer bearbeitet... und sollen am Ende auf die Festplatte geschrieben werden.
Allerdings werden die Objekte nicht korrekt (oder zumindest nicht so wie ich mir das vorstelle) serialisiert.
Nach ausgiebigem googeln und lesen der der Dokumentationen habe ich folgendes Testprogramm gebastelt um die Serialisierung mal ein bisschen zu testen:

(Die Aufteilung in mehrere Klassen habe ich vorgenommen um die Architektur meines eigendlichen Programmes besser darzustellen)

Class: MoohTest
Code:
import java.util.GregorianCalendar;
import java.util.Vector;
import dataAccessLayer.*;

public class MoohTest
{
		
	@SuppressWarnings("unchecked")
	public static void main(String[] args)
	{
		Vector<String[]> v1=new Vector<String[]>();
		String[] data1 =new String[10];
		data1[5]="testeMich";
		v1.add(data1);
		DatenSpeichern.speichern(v1);
		v1.clear();
		v1 = DatenLesen.lesen("test.dat");
		if(data1[5].toString()==v1.firstElement()[5].toString())
		{
			System.out.println("passt");
		}
		else
		{
			System.out.println("passt nicht");
		}			
		//gegenversuch
		Vector<GregorianCalendar[]> v2=new Vector<GregorianCalendar[]>();
		GregorianCalendar[] data2 =new GregorianCalendar[10];
		data2[5]=new GregorianCalendar(2007,1,1);
		v2.add(data2);
		DatenSpeichern.speichern(v2);
		v2.clear();
		v2 = DatenLesen.lesen("test.dat");
		if(data2[5].getTime()==v2.firstElement()[5].getTime())
		{
			System.out.println("passt");
		}
		else
		{
			System.out.println("passt nicht");
		}
		//gegenversuch
		Vector<int[]> v3=new Vector<int[]>();
		int[] data3 =new int[10];
		data3[5]=47;
		v3.add(data3);
		DatenSpeichern.speichern(v3);
		v3.clear();
		v3 = DatenLesen.lesen("test.dat");
		if(data3[5]==v3.firstElement()[5])
		{
			System.out.println("passt");
		}
		else
		{
			System.out.println("passt nicht");
		}
	}
}

Class: DatenSpeichern
Code:
package dataAccessLayer;

import java.io.*;
import java.util.Vector;

public class DatenSpeichern
{
	public static void speichern(Vector data)
	{
		try
		{
			FileOutputStream datei = new FileOutputStream("test.dat");
			ObjectOutputStream speichern = new ObjectOutputStream(datei);
			speichern.writeObject(data);
		}
		catch(IOException e){}
	}
}

Class: DatenLesen
Code:
package dataAccessLayer;

import java.io.*;

import java.util.Vector;

public class DatenLesen
{
	@SuppressWarnings("unchecked")
	public static Vector lesen(String dateiName) 
	{
		try
		{
			FileInputStream datei=new FileInputStream(dateiName);
			ObjectInputStream lesen = new ObjectInputStream(datei);
			Vector giveback = (Vector)lesen.readObject();
			return giveback;
		}
		catch(ClassNotFoundException e){System.out.println("fehler beim Lesen");return new Vector();}
		catch(FileNotFoundException e){System.out.println("fehler beim Lesen");return new Vector();}
		catch(IOException e){System.out.println("fehler beim Lesen");return new Vector();}
	}
}

Das ganze Liefert als Ausgabe:

passt nicht
passt nicht
passt

Es hat also nur die Serialisierung des Integer-Arrays geklappt.
Ist es mit Java nicht möglich komplexere Objekte zu serialisieren oder steckt in dem Ganzen ein denkfehler?
 
Strings müssen in java mit equals überprüft werden und nicht mit ==. Strings sind Objekte und == prüft nur ob das Objekt dasselbe ist, nicht jedoch den Inhalt. Dies macht man mit equals.

Also probiers mal
Java:
if(data1[5].equals(v1.firstElement()[5]))

Das toString() war ebenfalls überflüssig denn es sind schon Strings die du bekommst.
 
Hallo zeja,

stimmt, da hatte ich wohl Tomaten auf den Augen :)

ich werde das mal in mein eingendliches Programm übertragen und dann nochmal rückmeldung geben, ob es daran lag oder ob das Problem weiter besteht.

Danke für die schnelle Antwort.

Schneemensch
 
und des weiteren:

Ich bin mir zwar nicht sicher aber ich kann mir nicht vorstellen das java.util.GregorianCalendar serialisierbar ist.

Falls doch interessiert mich das auch
 
Hallo zusammen,

ich hab mein Problem jetzt gelöst...
die oberste Klasse der Vererbungshierarchie hatte Serializable nicht implementiert :rolleyes:

aber ich habe so rausbekommen, dass GregorianCalendar serialisiert werden kann.
Danke für eure Hilfe.

Schneemensch
 

Neue Beiträge

Zurück