# Serialisierung von statischen Attributen



## Tsa (29. Januar 2007)

Hallo,
Ich beschäftige mich gerade mit Serialisierung, da ich ein Netzwerkprojekt anstrebe. Nun habe ich gelesen, dass statische Attribute nicht mit serialisiert werden, man aber eine Methode writeObject/readObject schreiben kann. 

Dazu hab ich nun noch 2 Fragen: 
1) Wie sieht das ganze nun in Code aus? Also ein Beispiel Code wäre super 
2) Wenn ich eine Liste hab mit anderen Objekten gefüllt, wird dann die komplette Liste geschickt + INHALTE verschickt? 

Das reicht auch erstmal für den Anfang. Sollte ich noch Fragen haben schreib ich sie rein.

mfg,
Jens


----------



## Thomas Darimont (30. Januar 2007)

Hallo,



> Ich beschäftige mich gerade mit Serialisierung, da ich ein Netzwerkprojekt anstrebe. Nun habe ich gelesen, dass statische Attribute nicht mit serialisiert werden, man aber eine Methode writeObject/readObject schreiben kann.


Ja statische Member werden nicht mitserialisiert. Statische Informationen hängen an der Klasse. Durch Serialisierung eines Objekts wird per default die Information übermittelt um welche Klasse es sich handelt (welche Version) und was der Inhalt der wiederum Serialisierbaren Teile dieses Objekts ist (+ Metainformationen).

Standardmäßig ignoriert java bei der Serialisierung Member die als static oder transient definiert sind. Weiterhin unterstützt die Serialisierung standardmäßig alle primitiven Typen (int, double, char) und von Serializable/Externalizable abgeleitete Typen. Durch die Definition von writeObject(..) / readObject(...) Methoden kann man das Verhalten der Serialisierung jedoch beeinflussen. Darüber hinaus gibts natürlich noch ein paar weitere Wege die Serialisierung "anzupassen" beispielsweise über die Methode readResolve() mit der man bestimmen kann was von einem ObjectInputStream tatsächlich bei readObject() zurückgegeben wird. Zusätzlich gibts hier noch die Methoden writeReplace() und readReplace() mit denen man ähnlich wie bei readResolve() steuern kann welches Object nun von readObject() zurückgegben soll (mit leicht veränderter Semantik). Außerdem kann man optional über ObjectStreamField[] serialPersistentFields explizit die Member angeben die mitserialisert werden sollen. Implementiert man das Externalizable Interface so hat man über die Methoden readExternal(..) / writeExternal(...) weitere Kontrolle über die Serialisierung.
Mehr dazu gibts hier:
http://java.sun.com/javase/6/docs/platform/serialization/spec/serialTOC.html

Schau mal hier:
http://www.tutorials.de/forum/java/206651-nochmal-serialisieren.html
http://www.javalobby.org/java/forums/t17491.html



> 2) Wenn ich eine Liste hab mit anderen Objekten gefüllt, wird dann die komplette Liste geschickt + INHALTE verschickt?


Es wird die Liste (und alle serialisierbaren Elemente darin) serialisiert -> bzw. kommt das auf die Implementierung drauf an. Wenn die Implementierung deiner Liste die enthaltenen Elemente in einer Serialisierbaren Struktur hält, dann werden auch die Elemente (sofern sie auch Serialisierbar sind) mit serialisiert. Bei den serialisierbaren Listen aus der Java API (ArrayList, LinkedList, Vector, etc.) ist das kein Problem.

Gruß Tom


----------

