# Serialisieren von Objekten



## bl4ck29 (14. Mai 2005)

also ich hab schon mit google gesucht aber konnte kein wirklich gutes beispiel finden was mir das etwas klarer macht.... ich muss nen paar objekte persistent machen und würd mich freuen wenn vllt einer mal nen kleines beispiel posten könnte....

danke


----------



## Thomas Darimont (14. Mai 2005)

Hallo!

Bei der Serialisierung gibt es ein paar Dinge zu beachten. Objekte die du serialisieren willst müssen entweder das Serializable oder das Externalizable Interface implementieren. Bei letztem bestimmt das Objekt selbst "wie" es auf den Persistenten Speicher geschreiben wird. Weiterhin müssen alle (Persistenten) Attribute auch Serialisierbare typen sein (Primitive (int, double, char...)  sind alle Serialisierbar, bei Referenztypen kommt dann wieder das Serialzable Interface ins Spiel). Weiterhin kann es ab und an mal (bei Problemen) nötig sein den ObjektXStream per reset() zurückzusetzen um interne Cache-Repräsentationen zu löschen. (Mehr dazu in der Java API-Doc)

Hier mal ein kleines Beispiel:

```
/**
 * 
 */
package de.tutorials;

import java.io.Serializable;
import java.util.Date;

/**
 * @author Tom
 */
public class Person implements Serializable {

	private String name;

	private Date dateOfBirth;

	public Person() {
		this(null, null);
	}

	public Person(String name, Date dateOfBirth) {
		this.name = name;
		this.dateOfBirth = dateOfBirth;
	}

	public Date getDateOfBirth() {
		return dateOfBirth;
	}

	public void setDateOfBirth(Date dateOfBirth) {
		this.dateOfBirth = dateOfBirth;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public boolean equals(Object obj) {
		if (obj instanceof Person) {
			Person other = (Person) obj;

			return this.name.equals(other.name)
					&& this.dateOfBirth.equals(other.dateOfBirth);

		} else {
			return false;
		}
	}

	public int hashCode() {
		return this.name.hashCode() * 37 + this.dateOfBirth.hashCode();
	}

	public String toString() {
		return "Name: " + this.name + ", dateOfBirth: " + this.dateOfBirth;
	}

}
```


```
/**
 * 
 */
package de.tutorials;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Date;

/**
 * @author Tom
 */
public class SerializationExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {

		Person p = new Person("Tom", new Date());
		System.out.println(p);

		// Auf die Festplatte speichern
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
				"c:/person.ser"));

		oos.writeObject(p);

		oos.flush();
		oos.close();

		// Von der Festplatte laden
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
				"c:/person.ser"));
		Person p2 = (Person) ois.readObject();
		ois.close();

		System.out.println(p2);
	}

}
```

Gruß Tom


----------



## bl4ck29 (14. Mai 2005)

ok, werds gleich mal testen !

danke


----------



## bl4ck29 (14. Mai 2005)

also das schreiben der datei scheint wohl zu funktionieren, aber das laden aus der datei klappt nicht. ich bekomm immer null pointer exception....


```
package GUI;
import java.io.Serializable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;
public class Serialisieren implements Serializable {
	private ObjectOutputStream out;
	private ObjectInputStream in;
 
	public Serialisieren(){
		try {
			out = new ObjectOutputStream(new FileOutputStream("c:/temp/fb.ser"));
			in = new ObjectInputStream(new FileInputStream("c:/temp/fb.ser"));
		}
		catch (IOException io){ }
	}
 
	public void speicherObj(Object objekt) throws IOException{
		out.writeObject(objekt);
		out.flush();
		out.close();
	}
 
	public Object ladeObj() throws IOException,ClassNotFoundException {
		Object temp = in.readObject();
		in.close();
		return temp;
	}
 
}
```
 
das ist mein code und so sieht der aufruf in der klasse auf die das objekt laden soll.


```
Serialisieren ser = new Serialisieren();
try{
			panel = (JPanel) ser.ladeObj();
		}catch....
```
 
mach cih was falsch ? ihc hab auch gelesen das jede serialisierbare klasse ne id haben muss ?!

//edit : sobald ich die laden methode aufrufe schrumpft die datei in der gespeichert wurde auf 4byte, sie ist quasi leer


----------



## Thomas Darimont (14. Mai 2005)

Hallo!


```
catch (IOException io){ }
```

... wird wohl ne passende Fehlermeldung verschlucken...
->

```
catch (IOException ioe){ ioe.printStackTrace(); }
```

Gruß Tom


----------



## bl4ck29 (14. Mai 2005)

hmm, es kommt die gleiche meldung wie vorher..

```
null
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
```
das null is die io exception beim laden des objekts, aber die datei in die ich geschrieben habe hat 80kb und hat inhalt, zumindest solang bis ich die lade methode aufruf dann schrumpft die auf 4byte....


----------

