Input/Output Serialisierung

javapklein

Mitglied
Hallo,
ich bekomme bei der Serialisierung und Deserialisierung nicht den korrekten Output.
Die Zeile 63 soll die Ausgabe wie Zeile 51 haben.
Bisher bekomme ich jedoch nur die Angaben zu dem Hund. Das alter und der besitzer fehlen.
Wie kann ich diese schreiben und wieder einlesen?
Anbei der Code:
Java:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class Lebewesen {
	protected int alter;

	Lebewesen(){		
	}
	Lebewesen(int alter) {	
		this.alter = alter;
	}
	public int getAlter() {
		return alter;
	}	
}
class Mensch extends Lebewesen {
	private String vorname;
	private String nachname;		
	
	Mensch(String vorname, String nachname) {
		this.vorname = vorname;
		this.nachname = nachname;
	}	
	public String toString() {
		return vorname + " " + nachname;
	}
}
class Hund extends Lebewesen implements Serializable {
	
	private String name;
	private transient Mensch besitzer;
			
	Hund(int alter, String name, Mensch besitzer) {
		super(alter);
		this.name = name;
		this.besitzer = besitzer;			
	}
	public String toString() {
		return "Hund: " + name + ", Alter: " + alter + ", Besitzer: " + besitzer;
	}
}
public class Test {

	public static void main(String[] args) {
		
		Hund h = new Hund(2, "Max", new Mensch("Otto", "Meyer"));
		Lebewesen l = new Lebewesen();
		System.out.println(h);
		try {
			FileOutputStream fos = new FileOutputStream("hund.txt");
			ObjectOutputStream os = new ObjectOutputStream(fos);
			os.writeObject(h);
			os.writeInt(l.getAlter());
			os.close();
			FileInputStream fis = new FileInputStream("hund.txt");
			ObjectInputStream is = new ObjectInputStream(fis);
			Hund h2 = (Hund) is.readObject();
			l.alter = is.readInt()  ;
			is.close();
			System.out.println(h2);
			} catch (Exception x ) {
				System.out.println("Fehler hier");
				x.printStackTrace();
			}			
	}
}
 
Zuletzt bearbeitet von einem Moderator:
transient Attribute werden aber sonst "ausgespart". Anders geht es nicht, das würde dem Serialisierungs-Prinzip widersprechen
 
Diese Daten müssen auch extra geschrieben und wieder gelesen werden. Wie macht man dies? Wie müssen eigene Methoden für writeObject und readObject aussehen. Habe es mit den Zeilen 56 und 61 probiert. Leider funktioniert dies nicht. Das alter hat immer noch den wert 0. Für Hilfe mit Code wäre ich dankbar.
 
hier mal nen beispiel für eigene methoden zum lesen und schreiben


lesen(mitm tollen progressbarbalken bis das teil geladen is):

Java:
 public static void loadKMEANS_ClusterList_from_DB_noXML(){
    String fileName = "kmeansClusterlist.ser";
    try{
        
        final ObjectInputStream o = new ObjectInputStream(new BufferedInputStream(
                            new ProgressMonitorInputStream(null, "Lese "
                                    + fileName, new FileInputStream(fileName))));

                    KMEANS.ClusterList = (ArrayList<cluster>) o.readObject();
                    KMEANS.PflanzenListe = (ArrayList <String>) o.readObject();
                    o.close();
                 
            }
             catch (Exception e){
        System.out.println("fehler! bei kmeans");   

             }
       }

und hier schreiben:

Java:
 public static void writeKMEANS_ClusterList_to_DB_noXML(){
        
        try{
            
            FileOutputStream datei = new FileOutputStream("kmeansClusterlist.ser");
          //  ByteArrayOutputStream baos = new ByteArrayOutputStream(datei);
            ObjectOutputStream o = new ObjectOutputStream(datei);
           System.out.println("Clusterlist wird nun gespeichert!");
            o.writeObject(KMEANS.ClusterList);
            o.writeObject(SIFT.PflanzenListe);
            System.out.println("Clusterlist gespeichert!");
            o.close();
            
        }
        catch(IOException e){
            System.err.println(e);
        }
        
    }


und ansonsten habe ich irgendwas mal gelesen über "protected" und serialisierung. mach mal zum test public auch wenn das jetzt nicht rational zu erklären ist und ich da event. auch falsch liege.

aber:
ich denke man sollte die klasse lebewesen mit "implements Serializable" machen + für einfach alles was du irgendwie speichern willst getter und setter weil es sich hier um eigene klassen handelt.
 
So ich habe das Problem selbst gelöst.
Ich habe eine eigene readObject und writeObject Methode geschreiben. Der Clou war, dass ich das alter auch in der Klasse Hund definieren mußte.
Anbei der funktionierende Code:
Java:
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.NoSuchElementException;

class Lebewesen {
	private int alter;

	Lebewesen(){		
	}
	Lebewesen(int alter) {	
		this.alter = alter;
	}	
}
//-------------------------------------------------------------
class Mensch extends Lebewesen {
	private String vorname;
	private String nachname;		
	
	Mensch(String vorname, String nachname) {
		this.vorname = vorname;
		this.nachname = nachname;
	}	
	public String toString() {
		return vorname + " " + nachname;
	}
	public String getVorname() {
		return vorname;
	}
	public String getNachname() {
		return nachname;
	}	
}
//-------------------------------------------------------------
class Hund extends Lebewesen implements Serializable {
	
	private String name;
	private int alter;
	private transient Mensch besitzer;
			
	Hund(int alter, String name, Mensch besitzer) {
		super(alter);
		this.name = name;
		this.alter = alter;
		this.besitzer = besitzer;			
	}
	public String toString() {
		return "Hund: " + name + ", Alter: " + alter + ", Besitzer: " + besitzer;
	}
	private void writeObject(ObjectOutputStream os) throws IOException {
		try {
			os.defaultWriteObject();
			os.writeUTF(besitzer.getVorname());
			os.writeUTF(besitzer.getNachname());
		} catch (IOException e) {
			throw new IOException("writeObject "+ e.getClass().getSimpleName() +": " + e.getMessage());
		} catch (Exception e) {
			System.out.println("writeObject - Sonstiger Fehler" + e.getClass().getSimpleName() +": " + e.getMessage());
		}
	}
	private void readObject(ObjectInputStream is) throws IOException{
		try {
			is.defaultReadObject();
			besitzer = new Mensch(is.readUTF(), is.readUTF());			
		}
		catch (IOException e) {
			throw new IOException("readObject "+ e.getClass().getSimpleName() +": " + e.getMessage());
		}catch (Exception e) {
			System.out.println("readObject - Sonstiger Fehler" + e.getClass().getSimpleName() +": " + e.getMessage());
		}		
	}
}
//--------------------------------------------------------------------------------
public class Test {

	public static void main(String[] args) {
		
		Hund h = new Hund(2, "Max", new Mensch("Otto", "Meyer"));		
		System.out.println(h);
		
		try {	
			FileOutputStream fos = new FileOutputStream("hund.txt");
			ObjectOutputStream os = new ObjectOutputStream(fos);
			os.writeObject(h);	
			os.close();
		}catch (IOException e ) {
			System.out.println("IOFehler beim Outstream aufgetreten");
			e.printStackTrace();
		} catch (Exception e ) {
			System.out.println("Sonstiger Fehler beim Outstream aufgetreten.");
			e.printStackTrace();
		}
       	
		try {
			FileInputStream fis = new FileInputStream("hund.txt");
			ObjectInputStream is = new ObjectInputStream(fis);
			Hund h2 = (Hund) is.readObject();			
			System.out.println(h2);
			is.close();
			} catch (IOException e ) {
				System.out.println("IOFehler beim Instream aufgetreten");
				e.printStackTrace();
			} catch (Exception e ) {
				System.out.println("Sonstiger Fehler beim Instream aufgetreten");
				e.printStackTrace();
			}
	}
}

Nochmals vielen Dank für die Unterstützung, vielleicht kann ja auch jemand mit dem Code was anfangen.
 

Zurück
Oben