Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Marshalling & Unmarshalling

Ähnliche Dokumente
Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Marshalling & Unmarshalling

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

Verteilte Systeme Übung

Überblick. Class-Objekte. Bietet die Möglichkeit das Laufzeitverhalten von Applikationen zu analysieren und es gegebenenfalls sogar zu beeinflussen

Überblick. Beispiel: get()-methodenaufruf am VSBoard aus Übungsaufgabe 1. Analyse einer Methode: java.lang.reflect.method

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

Überblick. Fernmethodenaufrufe

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

Überblick. Verteilte Systeme Übung. VS-Übung. Dynamische Proxies Stubs & Skeletons Dynamische Proxies als Stubs. Tobias Distler, Michael Gernoth

Überblick. Stubs & Skeletons Java Reflection API Dynamische Proxies als Stubs Generische Skeletons Aufgabe 2. VS-Übung (SS17) Stubs & Skeletons 2 1

Überblick. Java Reflection API. Class-Objekte

Überblick. Verteilte Systeme - 4. Übung. Dynamische Proxies Stubs & Skeletons Dynamische Proxies als Stubs

Leseprobe. Rainer Oechsle. Java-Komponenten. Grundlagen, prototypische Realisierung und Beispiele für Komponentensysteme

Info B VL 14: Java Collections/Reflections

Überblick. Verteilte Systeme - 4. Übung. VS-Übung. Dynamische Proxies Stubs & Skeletons Dynamische Proxies als Stubs. Tobias Distler, Michael Gernoth

Meta Programming and Reflection in Java

Java Reflection. Andreas Lochbihler. 15. Mai Lehrstuhl Programmierparadigmen Universität Karlsruhe

F.1 Überblick. 1 RPC-System in Aufgabe 3. Kommunikationsschicht: tauscht Daten zwischen zwei Rechnern aus

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

Objektserialisierung

AvO-Übung 2 Remote Method Invocation

E.2 Fragen zu Aufgabe 2

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

Algorithmen und Datenstrukturen

D.1 Organisatorisches

Tag 8 Repetitorium Informatik (Java)

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

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

12 Abstrakte Klassen, finale Klassen und Interfaces

Problemstellung. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 24: Reflection 1. IDE und automatische Tests.

Repetitorium Informatik (Java)

Übungsaufgabe 5. Verteilte Systeme - 6. Übung. Fehler & RPC (lokaler Fall) Transparenz beim Fernaufruf. RPC-Aufrufsemantiken Fehlermodell

Einführung: Verteilte Systeme - Remote Method Invocation -

Tag 4 Repetitorium Informatik (Java)

Java Reflection. Meta-Programmierung mit der java.lang.reflection API. Prof. Dr. Nikolaus Wulff

Reflection. Programmieren 2 - H.Neuendorf (131)

Rechnernetze I SS 2017 Rechnernetze I (1/13) Rechnernetze I SS 2017 Datendarstellung Rechnernetze I (10/13)

Informatik II Übung 5

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

Rechnernetze I. SoSe Universität Siegen Tel.: 0271/ , Büro: H-B Stand: 13.

Properties und Proxies

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

Instrumentierung und Dekodierung

Java-Grundkurs für Wirtschaftsinformatiker

Klassen und Objekte. Einführung in Java. Folie 1 von Mai Ivo Kronenberg

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Java Remote Method Invocation (RMI)

Kapitel 8: Serialisierbarkeit

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

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

Java Input/Output System (IO)

Überblick. Verteilte Systeme Übung. VS-Übung. Callback Stubs revisited Callback JUnit. Tobias Distler, Michael Gernoth. Sommersemester 2010

B Java RMI B.2 B.4. 1 Java. 1.2 Methoden. 1.1 Objekte (2) 1.1 Objekte. Objektorientierte Sprache. Klassenbeschreibung. Methode ist eine Art Funktion

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Software Entwicklung 1

1 Klassen anlegen und Objekte erzeugen

Objektorientierung (OO)

1 Klassen anlegen und Objekte erzeugen

Java I Vorlesung 6 Referenz-Datentypen

Organisatorisches. Folien (u.a.) gibt's auf der Lva-Homepage zum Download

Informatik II - Tutorium 5

Probeklausur Java Einführung in die Informatik. Wintersemester 2016/2017

Grundelemente objektorientierter Sprachen (1)

Innere Klassen. Innere Klassen. Page 1. Lernziele: innere Klassen, statische geschachtelte Klassen, anonyme Klassen.

Programmieren 2 Java Überblick

E.1 Object Request Brokers

Programmieren 2 Java Überblick

Einstieg in die Informatik mit Java

Vorkurs Informatik WiSe 15/16

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Organisatorisches. Folien (u.a.) auf der Lva-Homepage Skriptum über MU Online

Beispiel: die Klasse Brüche

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Algorithmen und Programmierung III

Programmieren 2 11 Objekt-Serialisierung

Einstieg in die Informatik mit Java

Grundelemente objektorientierter Sprachen (1)

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

14 Abstrakte Klassen, finale Klassen, Interfaces

Grundelemente objektorientierter Sprachen (1)

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

14 Abstrakte Klassen, finale Klassen, Interfaces

Programmiertechnik Klassenvariablen & Instantiierung

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Informatik II Übung 6

Überblick. Fernaufrufe Motivation Stubs und Skeletons Marshalling und Unmarshalling Automatisierung XML-RPC. c td VS (SS17) Fernaufrufe 3 1

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Java I/O, Serialisierung und Netzwerkprogrammierung

Tag 7 Repetitorium Informatik (Java)

Informatik II Übung 06. Benjamin Hepp 5 April 2017

Tag 5. Repetitorium Informatik (Java) Dozent: Marius Kamp Lehrstuhl für Informatik 2 (Programmiersysteme)

Programmieren in Java

II.4.4 Exceptions - 1 -

Überblick. Verteilte Systeme - Übung. VS-Übung. Callback Stubs revisited Callback JUnit. Tobias Distler, Michael Gernoth, Reinhard Tartler

Java-Schulung Grundlagen

Transkript:

Überblick in Java Verteilte Systeme - Übung Tobias Distler, Michael Gernoth Friedrich-Alexander-Universität Erlangen-Nürnberg Lehrstuhl Informatik 4 (Verteilte Systeme und Betriebssysteme) www4.informatik.uni-erlangen.de in Java Sommersemester 2010 Tobias Distler, Michael Gernoth VS-Übung 3 1 VS-Übung in Java in Java Entwicklung eines eigenen Fernaufrufsystems Entwicklung eines eigenen Fernaufrufsystems Orientierung an Java-RMI Zunächst: Aufbau der Kommunikationsschicht Client Server Client Server Stub Skeleton Stub Skeleton Host A Kommunikationsschicht Host B Host A Kommunikationsschicht Host B Tobias Distler, Michael Gernoth VS-Übung 3 2 Tobias Distler, Michael Gernoth VS-Übung 3 3

in Java in Java Marshalling: Verpacken von Informationen in einer Nachricht Unmarshalling: Auspacken von Informationen aus einer Nachricht Client Server Problemstellungen Unterschiedliche Datentypen Heterogenität bei der lokalen Repräsentation von Datentypen Unterschiedliche Parameterübergabearten Stub Skeleton Host A Kommunikationsschicht Host B Tobias Distler, Michael Gernoth VS-Übung 3 4 Tobias Distler, Michael Gernoth VS-Übung 3 5 Unterschiedliche Datentypen in Java Heterogenität in Java Primitive Datentypen z.b. char, boolean, int,... Benutzerdefinierte Datentypen z.b. structs Felder z.b. int[47] Referenzen z.b. char * Objekte z.b. Strings, Dateien,... Kein allgemeines Vorgehen möglich Byte Sex -Problem Big Endian Most-significant byte first z.b. SPARC, Motorola Network Byte Order Little Endian Least-significant byte first z.b. Intel x86 Tobias Distler, Michael Gernoth VS-Übung 3 6 Tobias Distler, Michael Gernoth VS-Übung 3 7

Heterogenität in Java Heterogenität in Java Repräsentation von Fließkommazahlen Allgemein Vorzeichen (s) Mantisse (m) Exponent (e) Zahlenwert: ( 1) s m 2 e Variationsmöglichkeiten Anzahl der Bits für m und e Speicherreihenfolge von m, e und s Byte-Order Lösungsvarianten Kanonische Repräsentation Nutzung einer allgemeingültigen Form als Zwischenrepräsentation z.b. IEEE-Standard Evtl. unnötige Konvertierungen (z.b. wenn Sender und Empfänger identische Repräsentation nutzen) Sender makes it right Sender kennt Datenrepräsentation des Empfängers Sender konvertiert Daten Multicast an heterogene Gruppe nicht möglich Receiver makes it right Kennzeichnung des Datenformats Empfänger konvertiert Daten Bereitstellung sämtlicher Konvertierungsroutinen notwendig (Unproblematisch für Byte-Order-Konvertierung.) Tobias Distler, Michael Gernoth VS-Übung 3 8 Tobias Distler, Michael Gernoth VS-Übung 3 9 in Java Unterschiedliche Parameterübergabearten in Java Unterschiedliche Parameterübergabearten Eingabeparameter Teil der Anfragenachricht z.b. value in void setvalue(int value); Ausgabeparameter Teil der Antwortnachricht z.b. String-Returnwert in String tostring(); Ein-/Ausgabeparameter Teil der Anfrage- und Antwortnachricht z.b. Stack in Object pop(stack stack); Lösung: Einsatz geeigneter Semantiken Eingabeparameter Call-by-value Ausgabeparameter Call-by-result Ein-/Ausgabeparameter Call-by-value-result Zeiger dereferenzieren Tobias Distler, Michael Gernoth VS-Übung 3 10 Tobias Distler, Michael Gernoth VS-Übung 3 11

in Java in Java Relevanz der Problematiken in Java Unterschiedliche Datentypen Primitive Datentypen Objektreferenzen Problem relevant (siehe ) Heterogenität bei der lokalen Repräsentation von Datentypen Plattformunabhängigkeit Problem für Java-Nutzer nicht relevant Unterschiedliche Parameterübergabearten Eingabeparameter Ausgabeparameter Ein-/Ausgabeparameter Problem relevant (siehe Übungsaufgabe 3) in Java Tobias Distler, Michael Gernoth VS-Übung 3 12 Tobias Distler, Michael Gernoth VS-Übung 3 13 in Java von Objekten Interfaces in Java ObjectStream-Klassen ObjectOutputStream ObjectOutputStream ( OutputStream out ); void writeobject ( Object obj ); // Objekt senden [...] ObjectInputStream ObjectInputStream ( InputStream in ); Object readobject (); // Objekt empfangen [...] Interface java.io.serializable Muss von jedem Objekt implementiert werden, das über einen Object{Out,InputStream ausgetauscht wird Marker-Interface keine zu implementierenden Methoden {S,Deserialisierung wird vom Object{Out,InputStream übernommen Interface java.io.externalizable Schnittstellenbeschreibung public interface Externalizable extends Serializable { void writeexternal ( ObjectOutput out ); void readexternal ( ObjectInput in ); {S,Deserialisierung wird vom Objekt selbst übernommen Tobias Distler, Michael Gernoth VS-Übung 3 14 Tobias Distler, Michael Gernoth VS-Übung 3 15

transient-schlüsselwort in Java Konstanten in Java Einige Objekte sollen nicht serialisiert werden Sicherheitsaspekte Effizienzüberlegungen Einige Objekte können nicht serialisiert & deserialisiert werden, da sich ihr Zustand nicht so ohne weiteres wiederherstellen lässt FileInputStream Socket, ServerSocket Thread Schlüsselwort transient Mit transient gekennzeichnete Attribute werden bei der {S,Deserialisierung ignoriert class TransientExample { transient Thread t = new Thread (); Tobias Distler, Michael Gernoth VS-Übung 3 16 static final Klassenspezifische Konstanten Müssen bei ihrer Deklaration initialisiert werden Klassenweit eindeutig ( beim Empfänger bekannt) Nicht übertragen! final (nicht static) Objektspezifische Konstanten Können auch erst im Konstruktor initialisiert werden: public class FinalExample { public final int MAX_VALUE ; Übertragen! public FinalExample ( int maxvalue ) { MAX_VALUE = maxvalue ; Tobias Distler, Michael Gernoth VS-Übung 3 17 Einschub in Java Einschub in Java F: Welche Informationen über ein Objekt müssen übertragen werden, um es beim Empfänger vollständig deserialisieren zu können? A: Alle nichtrekonstruierbaren Teile des Objektzustands. F: Welche Teile sind das? A: Alle Werte von Attributen, die nicht,,transient oder,,static final sind. F: Was ist mit Attributen, die selbst Objekte sind? A: Diese Objekte müssen ebenfalls serialisiert werden. Alle vom Ausgangsobjekt (direkt oder indirekt) referenzierten Objekte sind in die Serialisierung einzubeziehen. Alle vom Ausgangsobjekt (direkt oder indirekt) referenzierten Objekte sind in die Serialisierung einzubeziehen. Mögliches Problem? Zyklische Objektgraphen z.b. verkettete Listen class ListEntry { Object value; ListEntry next; class ListEntry { Object value; ListEntry next; Es wird ein Abbruchkriterium benötigt. class ListEntry { Object value; ListEntry next; Tobias Distler, Michael Gernoth VS-Übung 3 18 Tobias Distler, Michael Gernoth VS-Übung 3 19

Strom-Gedächtnis in Java Beispielklasse in Java Es wird ein Abbruchkriterium benötigt. Lösung: Gedächtnis-Mechanismus Jedes zum ersten Mal gesendete bzw. empfangene Objekt wird in einer Tabelle eingetragen Statt ein Objekt erneut zu versenden wird ein Verweis auf seinen Tabelleneintrag übermittelt keine mehrmalige Serialisierung Sender und Empfänger erzeugen ihre Tabellen in identischer Weise Erhält der Empfänger einen Verweis auf einen Tabelleneintrag, so gibt er eine Referenz auf das bereits bestehende Objekt zurück keine Neuinstanzierung Probleme Tabelle wächst mit jedem neuen Objekt (keine Löschung!) Änderungen an Objekten werden nicht berücksichtigt public class ExampleObject { private String stringattr ; public int intattr ; public ExampleObject ( String s, int x) { stringattr = s; intattr = x; public String getstringattr () { return stringattr ; Tobias Distler, Michael Gernoth VS-Übung 3 20 Tobias Distler, Michael Gernoth VS-Übung 3 21 Strom-Gedächtnis in Java Strom-Gedächtnis in Java Sender ObjectOutputStream out = [...]; ExampleObject eo = new ExampleObject ("", 47); out. writeobject (eo ); eo. intattr = 48; out. writeobject (eo ); Empfänger ObjectInputStream in = [...]; ExampleObject eo1 = ( ExampleObject ) in. readobject (); System. out. println ( eo1. intattr ); ExampleObject eo2 = ( ExampleObject ) in. readobject (); System. out. println ( eo2. intattr ); Ausgabe 47 47 Lösung Bei Änderungen an bereits gesendeten Objekten: Reset des Gedächtnis am ObjectOutputStream void reset(); Tabelle wird auf beiden Seiten gelöscht Sender und Empfänger fangen bei Null an Änderung an eo nicht beim Empfänger sichtbar! Tobias Distler, Michael Gernoth VS-Übung 3 22 Tobias Distler, Michael Gernoth VS-Übung 3 23

in Java in Java Überblick in Java Bietet die Möglichkeit das Laufzeitverhalten von Applikationen zu analysieren und es gegebenenfalls sogar zu beeinflussen Paket: java.lang.reflect Ausführliches Tutorial http://java.sun.com/docs/books/tutorial/reflect/index.html This is a relatively advanced feature and should be used only by developers who have a strong grasp of the fundamentals of the language. Tobias Distler, Michael Gernoth VS-Übung 3 24 Tobias Distler, Michael Gernoth VS-Übung 3 25 in Java Überblick Erzeugung von Class-Objekten in Java Ermöglicht zur Laufzeit Analyse von Attributen Konstruktoren Methoden Erzeugung neuer Objekte Modifikation bestehender Objekte Dynamische Methodeaufrufe... Zentrale Klasse: java.lang.class Pro Objekttyp existiert ein unveränderliches Class-Objekt Beispiel String x = "x"; String y = "y"; boolean b = ( x. getclass () == y. getclass ()); // -> true Allgemein Funktioniert auch für primitive Datentypen Class c = <Klassenname>.class; Nur bei Objektreferenzen Dynamisch Class c = <Objekt>.getClass(); Statisch Class c = Class.forName(<Klassenname>); Tobias Distler, Michael Gernoth VS-Übung 3 26 Tobias Distler, Michael Gernoth VS-Übung 3 27

Erzeugung von Class-Objekten in Java Zentrale Methoden in Java java.lang.class<t> Navigation durch Klassenhierarchien Oberklasse Class c = <Class-Objekt>.getSuperclass(); Memberklassen/-schnittstellen/-enumerations Class[] c = <Class-Objekt>.getClasses(); Implementierte Schnittstellen Class[] c = <Class-Objekt>.getInterfaces(); Information boolean isprimitive (); boolean isarray (); boolean isenum (); Package getpackage (); Cast T cast ( Object object ); Typvergleich Geschachtelte Klassen boolean isinstance ( Object object ); boolean isassignablefrom ( Class <? > cls ); Class c = <Class-Objekt>.getEnclosingClass(); Tobias Distler, Michael Gernoth VS-Übung 3 28 Tobias Distler, Michael Gernoth VS-Übung 3 29 in Java in Java Analyse einer Klasse Analyse einer Klasse Attribute Field getfield ( String name ); Field getdeclaredfield ( String name ); Field [] getfields (); Field [] getdeclaredfields (); Konstruktoren Constructor getconstructor ( Class <? >... paramtypes ); Constructor getdeclaredconstructor ( Class <? >... pts ); Constructor [] getconstructors (); Constructor [] getdeclaredconstructors (); Methoden Allgemeine Semantik Zugriff auf public-elemente einer Klasse [...] get { Field, Constructor, Method ([...]) [...] get { Field, Constructor, Method s() Zugriff auf alle Elemente einer Klasse [...] getdeclared { Field, Constructor, Method ([...]) [...] getdeclared { Field, Constructor, Method s() Method getmethod ( String name, Class <? >... pts ); Method getdeclaredmethod ( String n, Class <? >... pts ); Method [] getmethods (); Method [] getdeclaredmethods (); Tobias Distler, Michael Gernoth VS-Übung 3 30 Tobias Distler, Michael Gernoth VS-Übung 3 31

Analyse von Attributen in Java java.lang.reflect.field Analyse von Methoden in Java java.lang.reflect.method Methodenname bestimmen Wert auslesen Allgemein Object get(object object); Primitive Datentypen <Datentyp> get<datentyp>(object object); z.b. getboolean(), getcharacter(), getint(),... String getname(); Parameter bestimmen Class<?>[] getparametertypes(); Rückgabewert bestimmen Class<?> getreturntype(); Exceptions bestimmen Class<?>[] getexceptiontypes(); Tobias Distler, Michael Gernoth VS-Übung 3 32 Tobias Distler, Michael Gernoth VS-Übung 3 33 Analyse von Konstruktoren in Java java.lang.reflect.constructor<t> Modifiers in Java java.lang.reflect.modifier Konstruktorname bestimmen String getname(); Parameter bestimmen Class<?>[] getparametertypes(); Exceptions bestimmen Class<?>[] getexceptiontypes(); Anwendbar für Klassen Attribute Methoden Konstruktoren Auslesen int m = <Class/Field/Method/Constructor-Objekt>.getModifiers(); Analyse mittels statischer Methoden der Klasse Modifier if(modifier.ispublic(m)) {... Analog: isfinal(), isstatic(), istransient(),... Tobias Distler, Michael Gernoth VS-Übung 3 34 Tobias Distler, Michael Gernoth VS-Übung 3 35

in Java Objekterzeugung/-modifikation/-nutzung Objekterzeugung in Java Neue Objektinstanz (java.lang.reflect.constructor<t>) T newinstance(object... initargs); Die bietet Möglichkeiten Objekte zu erzeugen Attribute zu modifizieren Methoden aufzurufen Beispiel ohne Reflections public static void main ( String [] args ) { ExampleObject eo = new ExampleObject (" Hello ", 47); [...] mit Reflections public static void main ( String [] args ) throws Exception { Class [] pts = new Class [] { String. class, int. class ; Constructor < ExampleObject > c = ExampleObject. class. getconstructor ( pts ); ExampleObject eo = c. newinstance (" Hello ", 47); [...] Tobias Distler, Michael Gernoth VS-Übung 3 36 Tobias Distler, Michael Gernoth VS-Übung 3 37 Objekterzeugung in Java Attributmodifikation in Java Spezialfall: Arrays Eigene Reflection-Klasse (java.lang.reflect.array) Statische Methoden zur Array-Erzeugung Beispiel Eindimensional Object newinstance(class<?> componenttype, int length) Mehrdimensional Object newinstance(class<?> componenttype, int[] dimensions) String [] stringarray ; stringarray = ( String []) Array. newinstance ( String. class, 10); Attribut auf neuen Wert setzen (java.lang.reflect.field) Beispiel Allgemein void set(object object, Object value); Primitive Datentypen void set<datentyp>(object object, <Datentyp> value); z.b. setboolean(), setcharacter(), setint(),... Field if = eo. getclass (). getfield (" intattr "); if. setint (eo, 48); Tobias Distler, Michael Gernoth VS-Übung 3 38 Tobias Distler, Michael Gernoth VS-Übung 3 39

Attributmodifikation in Java Methodenaufruf in Java Problem Field sf = eo. getclass (). getdeclaredfield (" stringattr "); sf.set (eo, " Hello, again "); IllegalAccessException Grund: stringattr ist private Lösung void setaccessible(boolean flag); Beispiel Field sf = eo. getclass (). getdeclaredfield (" stringattr "); sf. setaccessible ( true ); sf.set (eo, " Hello, again "); sf. setaccessible ( false ); Aufruf (java.lang.reflect.method) Object invoke(object obj, Object... args); Beispiel public String getstringattr() { Method m = eo. getclass (). getmethod (" getstringattr ", new Class [0]); String s = ( String ) m. invoke (eo, ( Object []) null ); Näheres in der Tafelübung zu Aufgabe 3... Tobias Distler, Michael Gernoth VS-Übung 3 40 Tobias Distler, Michael Gernoth VS-Übung 3 41 in Java : Überblick in Java in Java Ziel: Senden einer Nachricht (Java-Objekt) über eine Socketverbindung Methode: Verwendung eines Objekt-Stroms Client Server Stub Skeleton Host A Kommunikationsschicht Host B Tobias Distler, Michael Gernoth VS-Übung 3 42 Tobias Distler, Michael Gernoth VS-Übung 3 43

: Aufgabenstellung in Java : Aufgabenstellung in Java Implementierung eines Objekt-Stroms Serialisierung ObjectOutputStream VSObjectOutputStream VSObjectOutputStream ( OutputStream out ); OutputStream getoutputstream (); void writeobject ( Object obj ); void reset (); void close (); Deserialisierung ObjectInputStream VSObjectInputStream VSObjectInputStream ( InputStream in ); InputStream getinputstream (); Object readobject (); void close (); Implementierung eines Objekt-Stroms {S,Deserialisierung im Objekt-Strom Serializable verwenden {S,Deserialisierung im Objekt Externalizable VSExternalizable public interface VSExternalizable extends Serializable { public void writeexternal ( VSObjectOutputStream out ) public void readexternal ( VSObjectInputStream in) Nachbildung des Gedächtnis-Mechanismus Tobias Distler, Michael Gernoth VS-Übung 3 44 Tobias Distler, Michael Gernoth VS-Übung 3 45 in Java in Java Lösungsskizze Lösungsskizze VSObjectOutputStream.writeObject() public void writeobject ( Object obj ) throws [...] { if( obj wurde bereits gesendet ) { sende obj - Handle ; else { Class objclass = obj. getclass (); if( objclass ist Array ) { Sonderbehandlung -> Arrays ; else { sende obj als " normales " Objekt ; Objekt senden if( objclass implementiert VSExternalizable ) { rufe writeexternal () an obj auf ; else if( objclass implementiert Serializable ) { for ( alle Attribute ) { if( Attribut ist als " static final " gekennzeichnet Attribut ist als " transient " gekennzeichnet ) { ignoriere Attribut ; else if( Attribut ist primitiver Datentyp ) { Sonderbehandlung -> primitive Datentypen ; else { writeobject ( Attribut ); <-- Rekursion! else { werfe NotSerializableException ; Tobias Distler, Michael Gernoth VS-Übung 3 46 Tobias Distler, Michael Gernoth VS-Übung 3 47

Testen der Implementierung in Java in Java Randnotiz: Klassen ohne Default-Konstruktoren Test im Pub-Verzeichnis (/proj/i4vs/pub/a2/) Senden & Empfangen von VSMessageExample-Objekten 3 Einzeltests Exceptions Einzelnes VSMessageExample-Objekt Mehrere (verkettete) VSMessageExample-Objekte Deserialisierung eines Objekts am Empfänger Ziel: Bereitstellung von Speicherplatz für die Daten eines bereits bestehenden Objekts Problem: Ausführung eines Konstruktors kann Seiteneffekte haben Wie macht s Java? Verwendung der Factory sun.reflect.reflectionfactory Bereitstellung eines Spezial-Konstruktors Wichtig: VSObjectOutputStream und VSObjectOutputStream sollen auf beliebige Objekte ausgelegt sein! Änderung am VSObjectInputStream Code unter /proj/i4vs/pub/a2/non-default-constructor.txt Erzeugung des Objekts per Default-Konstruktor... Object object = objectclass.newinstance();...ersetzen durch... Tobias Distler, Michael Gernoth VS-Übung 3 48 Tobias Distler, Michael Gernoth VS-Übung 3 49 in Java import sun. reflect. ReflectionFactory ; [...] // Suche erste Oberklasse, die nicht Serializable ist Class c = objectclass ; while ( Serializable. class. isassignablefrom ( c)) { c = c. getsuperclass (); if( c == null ) throw new NotSerializableException (); // Hole Default - Konstruktor dieser Klasse Constructor instconstr = c. getconstructor ( new Class [0]); // Hole Spezialkonstruktor ReflectionFactory reflfactory = ( ReflectionFactory ) AccessController. doprivileged ( new ReflectionFactory. GetReflectionFactoryAction ()); Constructor constructor = reflfactory. newconstructorforserialization ( objectclass, instconstr ); // Instanziere Objekt Object object = constructor. newinstance (( Object []) null ); Tobias Distler, Michael Gernoth VS-Übung 3 50