12.2 Persistente Objekte

Ähnliche Dokumente
Kapitel 8: Serialisierbarkeit

Objektserialisierung

Java Input/Output System (IO)

Problemstellung. Object1:Klasse1. Object2:Klasse2 att1: Klasse1 att2: 9. att1: att2: 17. Klasse1 att1 att2 Klasse2 att1 att2

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

Programmieren 2 Selbststudium Semesterwoche 6

Grundlagen der Programmierung! Kapitel 10: Ein- und Ausgabe! Ziele dieses Kapitels! Datei! Das Problem!

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

Eingabe und Ausgabe in Java. Dr. Horst Treiblmaier Abteilung für Wirtschaftsinformatik WU Wien

Programmieren 2 11 Objekt-Serialisierung

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

Grundlagen der Programmierung. Kapitel 10: Ein- und Ausgabe. Ziele dieses Kapitels. Das Problem. Datei

Grundlagen der Programmierung. Kapitel 11: Ein- und Ausgabe. Ziele dieses Kapitels. Das Problem. Datei

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

Programmieren I. Kapitel 15. Ein und Ausgabe

Grundlagen der Programmierung. Kapitel 11: Ein- und Ausgabe. Ziele dieses Kapitels. Das Problem. Datei

Programmieren in Java

Algorithmen und Datenstrukturen II

AK-Automatisierungs und Kommunikationstechnik TI Technische Informatik. NWT Netzwerktechnik

Java I/O, Serialisierung und Netzwerkprogrammierung

Java - Programmierung - Prozedurale Programmierung 1

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Grundlagen der Programmierung! Kapitel 10: Ein- und Ausgabe! Ziele dieses Kapitels! Das Problem! Datei!

Client-Server TCP/IP - Kodierung

Ein String ist in Java eigentlich eine Klasse, wir können ihn aber zunächst als Datentyp betrachten, der zur Speicherung von Zeichenketten dient.

3. Grundlegende Sprachkonstruktionen imperativer Programme

Beispiel: Temperaturumwandlung. Imperative Programmierung. Schwerpunkte. 3. Grundlegende Sprachkonstruktionen imperativer Programme

Ausdrucksbäume in verschiedenen Darstellungen

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

Java I/O. Input / Output stream Library Regelt I/O über verschiedene Kanäle. Führt notwendige Umwandlungen/Konvertierungen aus

Einstieg in die Informatik mit Java

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

Java Übung. Übung 3. Werner Gaulke. 2. Mai Universität Duisburg-Essen Kommedia, Übung EinPro SS06, Einführung in Java - Übung.

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Java-Schulung Grundlagen

Primitive Datentypen

Umleitung von Datenströmen

Programmieren I. Dateien: Allgemeines. Vorlesung 10. Handout S. 1. Martin Schultheiß. Hochschule Darmstadt Wintersemester 2010/2011

Objektorientierung II & die Java Klassenbibliothek. Kristian Bergmann und Arthur Lochstampfer

Java Fehlerbehandlung

Schwerpunkte. 10. Felder (Arrays) Grundprinzip von Arrays. Klassifikation von Typen in Programmiersprachen

Grundlagen der Objektorientierten Programmierung - IO-Tools

java.io Ziel Ressourcen Page 1 Verstehen der unterschiedlichen I / O Möglichkeiten Anwenden der Java I/ O Klassen Java Tutorial Java API Dokumentation

C# - Einführung in die Programmiersprache Methoden. Leibniz Universität IT Services

Dateien: Allgemeines Dateien lesen Beispiel: CSV-Daten Filter Ausgabe in Dateien. Programmieren I. Martin Schultheiß

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

Fragenkatalog ESOP WS 16/17

Kapitel 12. Programmierkurs. Allgemeine Konzepte Byte-Streams versus Character-Streams

Grundlagen der Programmierung Prof. H. Mössenböck. 10. Klassen

Info B VL 7: Input/Output

EINFÜHRUNG IN DIE PROGRAMMIERUNG

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

Java Einführung IO (Eingabe/Ausgabe)

6.1.5 Verzeichnisdateien

Software Entwicklung 1

5. Übung zu Software Engineering

Streams. V by WBR1&MOU2/BFH-TI. Berner Fachhochschule Hochschule für Technik und Informatik HTI

Programmieren in Java -Eingangstest-

Java - Programmierung - Objektorientierte Programmierung 1

Datenströme in Java. Zeichenkonvertierung

1 Byteströme. 2 Spezialisierungen von Strömen. Lösungsskizze Aufgabe 1. Hinweise Aufgabe 2. Streams (Ein-/Ausgabe) Sockets (Netzwerkprogrammierung)

Java I/O. Input / Output stream Library Regelt I/O über verschiedene Kanäle. Führt notwendige Umwandlungen/Konvertierungen aus

Java Einführung Exception Handling. Kapitel 17

Programmieren 2 Java Überblick

TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK

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

Implementieren von Klassen

II.1.1. Erste Schritte - 1 -

Übungsstunde 9. Einführung in die Programmierung I

Instrumentierung und Dekodierung

Beispiel senden

Beispiel Time Client/Server

Silke Trißl Wissensmanagement in der Bioinformatik. Objektorientierte Programmierung (OOP) Vorstellung wie in der realen Welt: Farbe Hubraum Tank...

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete! 4. Ausnahmen (Exceptions) II.4.

Javakurs für Fortgeschrittene

Distributed Computing Group

System.out.println("TEXT");

Einführung in die Programmierung I. 2.0 Einfache Java Programme. Thomas R. Gross. Department Informatik ETH Zürich

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

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

Vorlesung Programmieren

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

B.2 Das Java Ein-/Ausgabesystem

Welcome to java. einfach objektorientiert verteilt interpretierend robust secure architekturneutral portabel schnell parallel(multitheded)

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Streams und Files. Datenströme Byteweises Lesen und Schreiben Zeichenweises Lesen und Schreiben Dateien Serialisierung

B.1 Überblick über die 1. Übung B.1 Überblick über die 1. Übung

B.2 Das Java Ein-/Ausgabesystem. B.1 Überblick über die 1. Übung. Streams (Ein-/Ausgabe) Sockets (Netzwerkprogrammierung) Serialisierung

Theorie zu Übung 8 Implementierung in Java

Dr. Monika Meiler. Inhalt

2.4 Datenabstraktion und Objektorientierung Datenabstraktion in Programmiersprachen

Streams und Files. Streams und Files. Datenströme Byteweises Lesen und Schreiben Zeichenweises Lesen und Schreiben Dateien Serialisierung

Ausgabe:

II.4.2 Abstrakte Klassen und Interfaces - 1 -

Dateien: Allgemeines Dateien lesen Beispiel: CSV-Daten Filter Ausgabe in Dateien. Programmieren I. Dr. Klaus Höppner

Javakurs für Anfänger

1. Erste Schritte 2. Einfache Datentypen 3. Anweisungen und Kontrollstrukturen 4. Verifikation 5. Reihungen (Arrays)

Transkript:

12.2 Persistente Objekte Persistenz im engeren Sinn bedeutet: Langzeitspeicherung für beliebig getypte Objekte Ideal Orthogonale Persistenz : Lebensdauer und Typ von Objekten sind unabhängige Konzepte alp3-12.2 1

12.2.1 Persistente Programmiersprachen Ideal: Folgendes sollte möglich sein: Table t = new Table(); t.enter(key,data);... t.put("mytable4711");... und am nächsten Tag: // Effekt: // Objekt ist auch Datei Table t; try { t = Table.get("myTable4711"); } catch(filenotfoundexception e) {...} catch(classcastexception e) {...} mit put und get in der Klasse Object... alp3-12.2 2

Anforderungen und Probleme: Objektidentität muss gewahrt bleiben. Kopieren des Objektwertes von der Halde in eine Datei und zurück gewährleistet das nicht. Insbesondere wenn mehrere Benutzer/Prozesse ein persistentes Objekt benutzen, sollten sie nicht etwa unabhängige Kopien benutzen. (Beachte: bei normalen Dateien ist das gesichert!) Konsequenz: keine getrennte Speicherverwaltung für virtuellen Speicher und Dateispeicher (Objekt = Segment = Datei) persistente Betriebssysteme persistente Programmiersprache (z.b. Napier88) alp3-12.2 3

Annäherung an das Ideal: Objekt in Datei schreiben bzw. aus Datei lesen, erfordert Serialisierung eines Objektgeflechts beim Kopieren von der Halde in die Datei bzw. Deserialisierung beim Wiederaufbau des Geflechts auf der Halde, wird von Java unterstützt. alp3-12.2 4

12.2.2 Objektserialisierung in Java http://java.sun.com/javase/6/docs/platform/serialization/spec/serialtoc.html In Java können nicht nur die Werte primitiver Datentypen, sondern auch die Werte von Objekten ausgegeben werden: interface ObjectOutput extends DataOutput* {... void writeobject(object x) throws IOException; } interface ObjectInput extends DataInput* {... Object readobject() throws IOException, ClassNotFoundException; } * für primitive Datentypen (12.1.3.2) alp3-12.2 5

Serialisierung in einen Ausgabestrom: class ObjectOutputStream extends OutputStream* implements ObjectOutput...{ ObjectOutputStream(OutputStream out) {...}... void writeobject(object x) throws IOException {...} } Das Objekt x wird in binärer Form - in geeignet serialisierter Darstellung - in den Strom out geschrieben. Wenn das Objekt Verweise enthält, wird der gesamte am Objekt hängende Objekt-Graph in geeignet serialisierter Darstellung in den Strom geschrieben. * Byte-Strom (12.1.3.1) alp3-12.2 6

Deserialisierung aus einem Eingabestrom: class ObjectInputStream extends InputStream* implements ObjectInput...{ ObjectInputStream(InputStream out) {...}... Object readobject() throws IOException, ClassNotFoundException {..} } Der Inhalt eines serialisierten Objekts wird eingelesen und als neu erzeugtes Objekt abgeliefert. Die beteiligten Klassen müssen geladen bzw. ladbar sein. Dabei wird der gesamte Objektgraph des ursprünglichen Objekts wieder aufgebaut. * Byte-Strom (12.1.3.1) alp3-12.2 7

Ein einfaches Beispiel: // store current date in a file: ObjectOutput out = new ObjectOutputStream( new FileOutputStream("today")); out.writeobject("this text was written on "); out.writeobject(new Date()); out.flush();... // retrieve file contents: ObjectInput in = new ObjectInputStream( new FileInputStream("today")); String text = (String)in.readObject(); Date date = (Date) in.readobject(); $ od -c today 0000000 254 355 \0 005 t \0 031 T h i s t e x t 0000020 w a s w r i t t e n o n 0000040 s r \0 016 j a v a. u t i l. D a 0000060 t e h j 201 001 K Y t 031 003 \0 \0 x p w 0000100 \b \0 \0 001 & 223 m 254 021 x alp3-12.2 8

... und das Kleingedruckte: Ein zu serialisierendes Objekt muss die Schnittstelle interface Serializable { } implementieren. Das gilt für alle Objekte im Objektgraph. Statische Attribute bleiben beim Serialisieren unberücksichtigt (weil es Klassendaten, nicht Objektdaten sind). Attribute, die mit dem Modifizierer transient markiert sind, bleiben beim Serialisieren unberücksichtigt; sie werden beim späteren Einlesen des Objekts mit den typspezifischen Voreinstellungen initialisiert. alp3-12.2 9

... und zum Thema Typsicherheit: Bla bla = (Bla)in.readObject(); ClassCastException: ClassNotFoundException: die Klasse des eingelesenen Objekts ist nicht die erwartete die Klasse des eingelesenen Objekts ist nicht greifbar Externe Darstellung des Objekts enthält Informationen, die seine Klasse identifizieren - genauer: Klassenname, Schnittstellen Attribute Signaturen der nichtprivaten Methoden... weitere Hashwert über diese Informationen Daher: andere Version der Klasse akzeptabel, sofern die Änderungen sich in gewissen Grenzen halten. alp3-12.2 10

Beispiel: privates Telefonbuch als Datei phbook - zeilenorientierte Benutzung: $ java PhoneBook phbook enter command : Lorenz 8255198 : d Lorenz deleted : a Lorenz 123456 added : q bye $ alp3-12.2 11

public class PhoneBook { public static void main(string[] arg) throws IOException, ClassNotFoundException { Map<String,Long> book; File file = new File(arg[0]); if(file.createnewfile()) // create new phbook book = new HashMap<String,Long>(); else { // load data from file InputStream s = new FileInputStream(file); ObjectInput in = new ObjectInputStream(s); book = (Map<String,Long>)in.readObject(); in.close(); } // interact with user: alp3-12.2 12

System.out.println("enter command"); // user interaction BufferedReader user = new BufferedReader( new InputStreamReader(System.in)); loop: for(;;) { System.out.print(": "); // prompt String line = user.readline(); if(line.equals("")) continue; String[] cmd = line.split(" "); if(cmd[0].length()==1) // command proper switch(line.charat(0)) { case 'a': book.put(cmd[1], Long.parseLong(cmd[2])); break; case 'd': book.remove(cmd[1]); break; case 'q': break loop; // quit default: System.out.println("?"); } else // lookup System.out.println(book.get(cmd[0])); }//loop alp3-12.2 13

ObjectOutput out = new ObjectOutputStream( new FileOutputStream(file)); out.writeobject(book); out.close(); System.out.println("bye"); } // end of main method } // end of class PhoneBook Resümee: Eingabe eines ausgegebenen Objekts erzeugt Kopie des alten Objekts. Wenn zwei Prozesse ein Objekt einlesen, erhalten sie unabhängige Kopien. Objektidentität geht verloren. Gemeinsame Teilobjekte werden dupliziert. alp3-12.2 14

Hinweis: Externalisierung ist Alternative zur Serialisierung: Zu externalisierendes Objekt stellt selbst Methoden zum Abspeichern und Wiederherstellen bereit! interface Externalizable implements Serializable { void writeexternal(objectoutput out) throws...; void readexternal (ObjectInput in) throws...; } http://java.sun.com/javase/6/docs/platform/serialization/spec/serialtoc.html alp3-12.2 15

12.2.3 Memory-Mapped Files (12.1.3.1 - byteorientierter Dateizugriff:) class FileOutputStream extends OutputStream { FileOutputStream(String pathname) {...}... void write(int by) {...} FileChannel getchannel() {...} } Liefert den dem FileOutputStream zugrundeliegenden Kanal vom Typ FileChannel- d.i. der zum Lesen bzw. Schreiben verwendete Iterator, den das Betriebssystem beim Öffnen einer Datei bereitstellt (z.b. in Unix identifizierbar über den file descriptor ). ( auch für FileInputStream und RandomAccessFile ) alp3-12.2 16

java.nio.channels ( new I/O ) : abstract class FileChannel... { abstract int read (ByteBuffer buf); abstract int write(bytebuffer buf); abstract long position(); // get read/write pointer abstract FileChannel position(long pos); // set read/write pointer - seek abstract long transferfrom(readablebytechannel src, long pos, long count); abstract long transferto(long pos, long count, WritableByteChannel dst); abstract MappedByteBuffer map(filechannel.mapmode mode, long pos, long size);... } alp3-12.2 17

abstract MappedByteBuffer map(filechannel.mapmode mode, long pos, long size)... Es wird ein MappedByteBuffer-Pufferobjekt erzeugt, das als Fenster auf einen Bereich der Datei fungiert ( memory-mapped file in Betriebssystem-Terminologie). Der FileChannel muss zum Lesen und/oder Schreiben geöffnet sein, wenn im Pufferobjekt gelesen bzw. geschrieben werden soll. mode: READ_ONLY READ_WRITE PRIVATE Ausnahmemeldung bei Schreibversuch Änderungen werden irgendwann in der Datei sichtbar und können auch in anderen Pufferobjekten sichtbar werden (sic!). private Kopie alp3-12.2 18

class MappedByteBuffer extends ByteBuffer... abstract class ByteBuffer extends Buffer... { byte[] array() {...} // the byte array inside the buffer abstract CharBuffer ascharbuffer(); //... viewed as characters abstract IntBuffer asintbuffer(); //... viewed as integers... abstract double getdouble(); abstract float getfloat();... abstract ByteBuffer putdouble(double x); abstract ByteBuffer putfloat(float x);... } alp3-12.2 19

Persistentes Objekt vom Typ byte[]: File f = new File("bytes"); long size = f.length(); FileChannel ch = new RandomAccessFile(f,"rws").getChannel(); MappedByteBuffer buf = map(filechannel.mapmode.read_write, 0, size); byte[] bytes = buf.array();... // operate on byte array object Entsprechendes geht auch für getypte Daten. Aber: nicht für Objekte beliebiger Klassen. alp3-12.2 20

12.2.4 Objektorientierte Datenbanken... kombinieren die Möglichkeiten von Datenbanken mit dem Prinzip der Objekt-Persistenz - aber das sprengt den Rahmen von ALP III! [ Dies ist die letzte Folie von ALP III im WS 09/10 ] alp3-12.2 21