Kapitel 8: Serialisierbarkeit

Ähnliche Dokumente
Objektserialisierung

Programmieren 2 11 Objekt-Serialisierung

Informatik B. Vorlesung 14 Serialisierung, Autoboxing. Dr. Ralf Kunze

Java Input/Output System (IO)

Kapitel 5: Interfaces

Lösungsvorschläge zur Nachklausur zum Kurs 1618 Sommersemester 2001 am

Programmieren 2 Selbststudium Semesterwoche 6

Programmieren in Java -Eingangstest-

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

JAVA für Einsteiger. Streams und Dateien. eden market Autor: Norman Lahme

Begriffe. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 15: Serialisierung, Persistenz, Versionierung. Begriffe.

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Java I/O, Serialisierung und Netzwerkprogrammierung

Punkte. Teil 1. Teil 2. Summe. 1. Zeigen Sie, dass der untenstehende Suchbaum die AVL-Bedingung verletzt und überführen Sie ihn in einen AVL-Baum.

II.4.5 Generische Datentypen - 1 -

Überblick. Java RMI Java Remote Method Invocation Marshalling und Unmarshalling Aufgabe 1. VS-Übung (SS12) Java RMI 1 1

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Teil 5 - Java. Programmstruktur Operatoren Schlüsselwörter Datentypen

Überblick. Java RMI Java Remote Method Invocation Marshalling und Unmarshalling Aufgabe 1. VS-Übung (SS16) Java RMI 1 1

Informatik II Übung 06. Benjamin Hepp 5 April 2017

Probeklausur: Programmierung WS04/05

Dynamische Datenstrukturen Jiri Spale, Algorithmen und Datenstrukturen - Dynamische Datenstrukturen 1

Matrikelnummer:

UNIVERSITÄT SIEGEN Fachbereich 12, Elektrotechnik und Informatik Fachgruppe Betriebssysteme / verteilte Systeme

Informatik II. Übungsstunde 6. Distributed Systems Group, ETH Zürich

Algorithmen und Datenstrukturen

Programmieren in Java

Java Einführung Klassendefinitionen

Einstieg in die Informatik mit Java

Das Interface-Konzept am Beispiel der Sprache Java

Programmieren 1 09 Vererbung und Polymorphie

Kapitel 4: Klassen und Unterklassen

Wiederholung. Klassenhierarchie:

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

1 Motivation. 1 Motivation. Standard Middleware für objektorientierte Anwendungen. Motivation. Fragmentierte Objektmodel. Java RMI

Einstieg in die Informatik mit Java

Programmierkurs Java

Prof. Dr. Wolfgang Schramm. Vorlesung. Techniken der Programmentwicklung. Exkurs: Anonyme Klassen

Allgemeine Informatik II SS :30-13:30 Uhr

Info B VL 8: Abstrakte Klassen & Interfaces

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

12 Abstrakte Klassen, finale Klassen und Interfaces

Anleitung. Ein einfaches RMI-Beispiel. (ab Java 5.0) c Y. Pfeifer. (Juni 2014)

Rückblick. Wie funktioniert Event-Handling in Java? Wozu dient ein Listener-Interface?

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

3 Objektorientierte Konzepte in Java

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Versuchsziele Konzepte der parallelen Programmierung am Beispiel von Threads anwenden können. Einbau von Kontrollmechanismen mittels Semaphore.

Programmierung Nachklausurtutorium

Vererbung, Polymorphie

Einstieg in die Informatik mit Java

Objektorientierte Programmierung. Kapitel 14: Interfaces

Einstieg in die Informatik mit Java

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete. II.4.2 Abstrakte Klassen und Interfaces - 1 -

Programmierung WS12/13 Lösung - Präsenzübung M. Brockschmidt, F. Emmes, C. Otto, T. Ströder

Einführung in die Programmierung

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Institut für Programmierung und Reaktive Systeme. Java 2. Markus Reschke

1 Abstrakte Klassen, finale Klassen und Interfaces

Programmieren I. Kapitel 15. Ein und Ausgabe

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

Programmieren in Java

Exkurs: ANONYME KLASSEN. Techniken der Programmentwicklung Prof. Dr. Wolfgang Schramm

Einführung: Verteilte Systeme - Remote Method Invocation -

Kapitel 3. Programmierkurs. Arten von Anweisungen. 3.1 Was sind Anweisungen?

Faulheit professionell: Fertige Datenbehälter. Das Java-Collections-Framework Typsicherheit Generische Klassen

Tag 8 Repetitorium Informatik (Java)

Transkript:

Liste P: Programmieren mit Java WS 2001/2002 Prof. Dr. V. Turau FH Wiesbaden Kapitel 8: Serialisierbarkeit Folie 189 : Serialisierbarkeit Die Umwandlung eines komplexen Objektes in ein Byte-Array nennt man Serialisierung Serialisierte Objekte können zu einem späteren Zeitpunkt wieder reproduziert werden, dieser Vorgang heißt Deserialisierung Bei der Serialisierung werden alle Informationen über die Struktur des Objektes abgespeichert Die binäre Darstellung kann in einer Datei abgespeichert über ein Netzwerk verschickt werden Folie 190 : Serialisierbarkeit Die Serialisierung wurde in Java Version 1.1 eingeführt Die Serialisierung von Objekten hat viele Anwendungen: Verteilte Systeme (RMI, Java Enterprise Beans, CORBA) Persistente Speicherung von Objekten Das Serialisierungskonzept in Java stützt sich auf wenige Klassen und Methoden und lässt sich sehr einfach anwenden Folie 191 : Serialisierbarkeit (Beispiel) Instanz der Klasse Stack wird serialisiert und in einer Datei abgespeichert Stack s = new Stack(); s.push(...);... FileOutputStream fos = new FileOutputStream("tmp.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeobject(s); oos.flush(); oos.close(); In einen ObjectOutputStream können beliebig viele Objekte reingeschrieben werden, sie müssen nur in der gleichen Reihenfolge wieder ausgelesen werden Folie 192 : Serialisierbarkeit (Beispiel)

Die serialisierte Instanz der Klasse Stack wird aus der Datei ausgelesen und deserialisiert Stack s; FileInputStream fis = new FileInputStream("tmp.ser"); ObjectInputStream ois = new ObjectInputStream(fis); s = (Stack) ois.readobject(); ois.close(); Folie 193 : Das Interface Serializable Eine Klasse deren Instanzen serialisiert werden sollen, muss das Interface Serializable aus dem Paket java.io implementieren Das Interface Serializable enthält keine Methoden Nicht jede Instanzvariable eignet sich zum abspeichern (z.b. Instanzen der Klasse File) Instanzvariablen mit dem Schlüsselwort transient werden nicht serialisiert Folie 194 : Serialisierbarkeit Alle Instanzvariablen welche nicht das Schlüsselwort transient haben, werden serialisiert Die Serialisierung ist ein rekursiver Prozess, d.h. ist der Wert einer Instanzvariablen ein Objekt, so wird auch dieses serialisiert (d.h. im letzten Beispiel werden die Objekte im Stack ebenfalls alle serialisiert) Es wird ein Objekt-Graph gespeichert Dopppelt referenzierte Objekte werden nur einmal serialisiert Folie 195 : Komprimierte Speicherung Zur Reduktion des Speicheraufwandes können Objekte auch komprimiert gespeichert werden Beispiel: StringStack st = new StringStack();... FileOutputStream fos = new FileOutputStream("tmp.ser.gz"); GZIPOutputStream gos = new GZIPOutputStream(fos); ObjectOutputStream oos = new ObjectOutputStream(gos); oos.writeobject(s); oos.flush(); oos.close(); Zum Einlesen wird die Klasse GZIPInputStream verwendet Folie 196 : Spezielle Anwendungen Der vorgestellte Defaultserialisierungssmechanismus erlaubt keinerlei Eingriffe in den Serialisierungsprozess Für manche Anwendungen ist dies nicht ausreichend Für diesen Fall gibt es zwei Alternativen: eine Klasse kann das Interface Externalizable implementieren der Defaultserialisierungssmechanismus kann beeinflusst werden Diese ermöglicht eine bessere Kontrolle des Serialisierungsprozesses Anwender tragen aber auch mehr Verantwortung

Folie 197 : Das Interface Externalizable Das Interface Externalizable public interface Externalizable extends Serializable { public void writeexternal(objectoutput out) throws IOException; public void readexternal(objectinput in) throws IOException, ClassNotFoundException; Diese Interface sollte nur in speziellen Anwendungen verwendet werden Folie 198 : Angepasste Serialisierung Um von dem Defaultserialisierungssmechanismus abzuweichen, kann eine Klasse die Methoden private void writeobject(objectoutputstream oos) throws IOException; private void readobject(objectinputstream ois) throws IOException, ClassNotFoundException; verwenden In diesen Methoden wird das Serialisierungverfahren implementiert Innerhalb dieser Methoden kann auf den Defaultmechanismus zurückgegriffen werden Folie 199 : Angepasste Serialisierung Hierzu stehen folgende Methoden public void defaultwriteobject() throws IOException public void defaultreadobject() throws IOException, ClassNotFoundException, NotActiveException aus den Klassen ObjectOutputStream und ObjectInputStream zur Verfügung. Vor und nach dem Aufruf dieser Methoden können spezielle Anpassungen vorgenommen werden Folie 200 : Beispiel Eine Klasse repräsentiert eine symmetrische Matrix, d.h. Werte oberhalb und unterhalb der Diagonalen sind identisch Beispiel:

1 4 7 15 4 3-2 5 7-2 -2 17 15 5 17 0 Beim Serialisieren genügt es, die obere "Hälfte" der Matrix zu speichern Folie 201 : Beispiel public class CustomDataExample implements Serializable { transient int dimension; transient int thearray[][]; private void writeobject(objectoutputstream s) throws IOException { // Für spätere Erweiterungen jetzt schon aufnehmen s.defaultwriteobject(); // Die Dimension wird gespeichert s.writeint(dimension); // die obere "Hälfte" der Matrix wird gespeichert for (int j = 0; j <= i; j++) { s.writeint(thearray[i][j]); Folie 202 : Beispiel private void readobject(objectinputstream s) throws IOException, ClassNotFoundException { // Für spätere Erweiterungen jetzt schon aufnehmen s.defaultreadobject(); // Die Dimension einlesen dimension = s.readint(); // Speicherplatz allozieren thearray = new int[dimension][dimension]; // die obere Hälfte einlesen for (int j = 0; j <= i; j++) { thearray[i][j] = s.readint(); // Den Rest rüberkopieren for (int j = dimension - 1; j > i; j--) { thearray[i][j] = thearray[j][i]; Folie 203 : Versionsverwaltung

Probleme entstehen, wenn nach der Serialisierung einer Instanz einer Klasse der Quellcode der Klasse geändert und die Klasse neu übersetzt wird Jede Änderung einer Instanzvariablen oder der Signatur einer öffentlichen Methode führt zu Inkompatibilitäten Kleinere Änderungen der Klasse beeinflussen nicht die Deserialiserbarkeit Wie kann festgestellt werden, ob die Deserialiserbarkeit verloren geht? Folie 204 : Versionsverwaltung Lösung: Versionsnummern Das Programm serialver bestimmt eine Versionsnummer für eine Klasse (Aufruf mit serialver -show) Diese Versionsnummer muss in einer statischen Instanzvariablen mit dem Namen serialversionuid vom Typ long abgespeichert werden static final long serialversionuid = 1224463164541339165L; Folie 205 : Das Werkzeug serialver Bei kleineren Änderungen bleibt diese Nummer unverändert Das Werkzeug serialver erzeugt mittels des Secure Hash Algorithm (SHA) eine Versionsnummer D.h. wird nach einer Änderung der Klasse die gleiche Versionsnummer festgestellt, so ist eine Deserialiserung weiterhin möglich