Marshalling & Unmarshalling Marshalling & Unmarshalling Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Überblick Verteilte Systeme - Übung Marshalling & Unmarshalling Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Tobias Distler, Michael Gernoth, Reinhard Tartler Friedrich-Alexander-Universität Erlangen-Nürnberg Lehrstuhl Informatik 4 (Verteilte Systeme und Betriebssysteme) www4.informatik.uni-erlangen.de Sommersemester 2008 Tobias Distler, Michael Gernoth, Reinhard Tartler Marshalling & Unmarshalling Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Marshalling & Unmarshalling VS-Übung I I Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Übungsaufgabe 2 Entwicklung eines eigenen Fernaufrufsystems Orientierung an Java RMI Client I I Server Stub Host A VS-Übung Entwicklung eines eigenen Fernaufrufsystems Zunächst: Aufbau der Kommunikationsschicht Client Stub Skeleton Kommunikationsschicht Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung Server Host B Host A Skeleton Kommunikationsschicht Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung Host B Marshalling & Unmarshalling Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Marshalling & Unmarshalling Marshalling & Unmarshalling I I Marshalling & Unmarshalling Marshalling: Verpacken von Informationen in einer Nachricht Unmarshalling: Auspacken von Informationen aus einer Nachricht Client Tobias Distler, Michael Gernoth, Reinhard Tartler Marshalling & Unmarshalling I Primitive Datentypen I Benutzerdefinierte Datentypen Unterschiedliche Parameterübergabearten Host B Tobias Distler, Michael Gernoth, Reinhard Tartler Marshalling & Unmarshalling Felder Referenzen VS-Übung Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Heterogenität “Byte Sex”-Problem I Big Endian I z.B. structs I I Heterogenität bei der lokalen Repräsentation von Datentypen I Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 z.B. char, boolean, int,... I I Unterschiedliche Datentypen I VS-Übung Unterschiedliche Datentypen I I Skeleton Kommunikationsschicht Host A I Problemstellungen Server Stub I Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 I I I z.B. int[47] Little Endian I I z.B. char * Most-significant byte first z.B. SPARC, Motorola Network Byte Order Least-significant byte first z.B. Intel x86 Objekte I z.B. Strings, Dateien,... → Kein allgemeines Vorgehen möglich Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung Marshalling & Unmarshalling Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Marshalling & Unmarshalling Heterogenität Heterogenität Repräsentation von Fließkommazahlen I Allgemein Lösungsvarianten I Kanonische Repräsentation Vorzeichen (s) I Mantisse (m) I Exponent (e) → Zahlenwert: (−1)s ∗ m ∗ 2e I Nutzung einer allgemeingültigen Form als Zwischenrepräsentation I z.B. IEEE-Standard → Evtl. unnötige Konvertierungen (z.B. wenn Sender und Empfänger identische Repräsentation nutzen) I I Variationsmöglichkeiten I I I Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 I Anzahl der Bits für m und e Speicherreihenfolge von m, e und s Byte-Ordnung “Sender makes it right” I Sender kennt Datenrepräsentation des Empfängers I Sender konvertiert Daten → Mögliches Problem: Multicast I “Receiver makes it right” I Kennzeichnung des Datenformats I Empfänger konvertiert Daten → Bereitstellung sämtlicher Konvertierungsroutinen notwendig Tobias Distler, Michael Gernoth, Reinhard Tartler Marshalling & Unmarshalling VS-Übung Unterschiedliche Parameterübergabearten I Eingabeparameter I I I Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Call-by-value I Ausgabeparameter I Ein-/Ausgabeparameter I Teil der Antwortnachricht z.B. String-Returnwert in I Call-by-result Call-by-value-result → Zeiger dereferenzieren String toString(); I VS-Übung Unterschiedliche Parameterübergabearten I Ausgabeparameter I Marshalling & Unmarshalling Lösung: Einsatz geeigneter Semantiken I Eingabeparameter Teil der Anfragenachricht z.B. value in void setValue(int value); I Tobias Distler, Michael Gernoth, Reinhard Tartler Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Ein-/Ausgabeparameter I I Teil der Anfrage- und Antwortnachricht z.B. Stack in Object pop(Stack stack); Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung Marshalling & Unmarshalling Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Marshalling & Unmarshalling Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Marshalling & Unmarshalling Relevanz der Problematiken in Java I Unterschiedliche Datentypen I Primitive Datentypen I Objektreferenzen → Problem relevant (siehe Übungsaufgabe 2) I Heterogenität bei der lokalen Repräsentation von Datentypen I Unterschiedliche Parameterübergabearten I Plattformunabhängigkeit → Problem für Java-Nutzer nicht relevant Marshalling & Unmarshalling Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Eingabeparameter Ausgabeparameter Ein-/Ausgabeparameter → Problem relevant (siehe Übungsaufgabe 3) I I I Tobias Distler, Michael Gernoth, Reinhard Tartler Marshalling & Unmarshalling VS-Übung Tobias Distler, Michael Gernoth, Reinhard Tartler Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Serialisierung & Deserialisierung von Objekten Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Interface java.io.Serializable Muss von jedem Objekt implementiert werden, das über einen Object{Out,In}putStream ausgetauscht wird Marker-Interface → keine zu implementierenden Methoden → {S,Des}erialisierung wird vom Object{Out,In}putStream übernommen I ObjectOutputStream O b j e c t Ou t pu t S t r e a m ( OutputStream out ); void writeObject ( Object obj ); [...] I VS-Übung Interfaces I ObjectStream-Klassen I Marshalling & Unmarshalling I // Objekt senden ObjectInputStream O b j ec tIn p utS tr e am ( InputStream in ); Object readObject (); [...] // Objekt empfangen I Interface java.io.Externalizable I Schnittstellenbeschreibung public interface Externalizable extends Serializable { void writeExternal ( ObjectOutput out ); void readExternal ( ObjectInput in ); } → {S,Des}erialisierung wird vom Objekt selbst übernommen Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung Marshalling & Unmarshalling Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 transient-Schlüsselwort I I I Sicherheitsaspekte Effizienzüberlegungen Einige Objekte können nicht serialisiert & deserialisiert werden, da sich ihr Zustand nicht so ohne weiteres wiederherstellen lässt I I I FileInputStream Socket, ServerSocket Thread class Tra nsi en tExam ple { transient Thread t = new Thread (); } Marshalling & Unmarshalling A: Alle nichtrekonstruierbaren Teile des Objektzustands. F: Welche Teile sind das? Mit transient gekennzeichnete Attribute werden bei der {S,Des}erialisierung ignoriert Tobias Distler, Michael Gernoth, Reinhard Tartler F: Welche Informationen über ein Objekt müssen übertragen werden, um es beim Empfänger vollständig serialisieren zu können? A: Alle Werte von Attributen, die nicht transient oder final sind. → Schlüsselwort transient I 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. VS-Übung Tobias Distler, Michael Gernoth, Reinhard Tartler Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Einschub Marshalling & Unmarshalling VS-Übung Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Strom-Gedächtnis → Alle vom Ausgangsobjekt (direkt oder indirekt) referenzierten Objekte sind in die Serialisierung einzubeziehen. → Es wird ein Abbruchkriterium benötigt. I Lösung: Gedächtnis-Mechanismus I Mögliches Problem? I I Zyklische Objektgraphen I z.B. verkettete Listen class ListEntry { Object value; ListEntry next; } Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Einschub Einige Objekte sollen nicht serialisiert werden I Marshalling & Unmarshalling I I class ListEntry { Object value; ListEntry next; } class ListEntry { Object value; ListEntry next; } I Probleme I → Es wird ein Abbruchkriterium benötigt. Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung 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 I I Tabelle wächst mit jedem neuen Objekt (keine Löschung!) Object{Out,In}putStream verhindert evtl. Garbage Collection Änderungen an Objekten werden nicht berücksichtigt Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung Marshalling & Unmarshalling Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Beispielklasse Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Strom-Gedächtnis Sender public class ExampleObject { private String stringAttr ; public int intAttr ; public ExampleObject ( String s , int x ) { stringAttr = s ; intAttr = x ; } } Marshalling & Unmarshalling public String getStringAttr () { return stringAttr ; } O b j e c t O u t p u t S t re a m out = [...]; ExampleObject eo = new ExampleObject ("" , 47); out . writeObject ( eo ); eo . intAttr = 48; out . writeObject ( eo ); Empfänger O b j e c tI n p u tS t r e a m in = [...]; ExampleObject eo1 = ( ExampleObject ) in . readObject (); System . out . println ( eo1 . intAttr ); ExampleObject eo2 = ( ExampleObject ) in . readObject (); System . out . println ( eo2 . intAttr ); Ausgabe 47 47 → Änderung an eo nicht beim Empfänger sichtbar! Tobias Distler, Michael Gernoth, Reinhard Tartler Marshalling & Unmarshalling VS-Übung Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Tobias Distler, Michael Gernoth, Reinhard Tartler Marshalling & Unmarshalling VS-Übung Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Strom-Gedächtnis 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 Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung Marshalling & Unmarshalling Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung Marshalling & Unmarshalling Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Java Reflection API Marshalling & Unmarshalling Überblick Java Reflection API I Bietet die Möglichkeit das Laufzeitverhalten von Applikationen zu analysieren und es gegebenenfalls sogar zu beeinflussen I Paket: java.lang.reflect I I Ausführliches Tutorial I I I I I I I This is a relatively advanced feature and should be used only by developers who have a strong grasp of the fundamentals of the language. Marshalling & Unmarshalling Funktioniert auch für primitive Datentypen Marshalling & Unmarshalling Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Erzeugung von Class-Objekten Navigation durch Klassenhierarchien I Oberklasse I Memberklassen/-schnittstellen/-enumerations Dynamisch: I Implementierte Schnittstellen I Geschachtelte Klassen Class c = <Objekt>.getClass(); I VS-Übung Class c = <Class-Objekt>.getSuperclass(); Nur bei Objektreferenzen I Pro Objekttyp existiert ein unveränderliches Class-Objekt Tobias Distler, Michael Gernoth, Reinhard Tartler Class c = <Klassenname>.class; I Erzeugung neuer Objekte Modifikation bestehender Objekte Dynamische Methodeaufrufe ... Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Allgemein I Attributen Konstruktoren Methoden Zentrale Klasse: java.lang.Class I VS-Übung Erzeugung von Class-Objekten I Analyse von I http://java.sun.com/docs/books/tutorial/reflect/index.html Überblick Ermöglicht zur Laufzeit I Tobias Distler, Michael Gernoth, Reinhard Tartler Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Class[] c = <Class-Objekt>.getClasses(); Statisch: Class[] c = <Class-Objekt>.getInterfaces(); Class c = Class.forName(<Klassenname>); Class c = <Class-Objekt>.getEnclosingClass(); Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung Marshalling & Unmarshalling Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Zentrale Methoden I Information boolean boolean boolean Package I java.lang.Class<T> Marshalling & Unmarshalling Analyse einer Klasse I I Cast boolean isInstance ( Object object ); boolean i sA ssi gna bl eF rom ( Class <? > cls ); Marshalling & Unmarshalling Konstruktoren Constructor getCons tructor ( Class <? >... paramTypes ); Constructor g e t D e c l a r e d C o n s t r u c t o r ( Class <? >... pTs ); Constructor [] g e tCon str ucto r s (); Constructor [] g e t D e c l a r e d C o n s t r u c t o r s (); Typvergleich Tobias Distler, Michael Gernoth, Reinhard Tartler Attribute Field getField ( String name ); Field ge t D e cl ar e d F ie ld ( String name ); Field [] getFields (); Field [] g e t D ec l ar e d F i el d s (); isPrimitive (); isArray (); isEnum (); getPackage (); T cast(Object object); I I Methoden Method getMethod ( String name , Class <? >... pTs ); Method g e tD e c l a r e d M et h o d ( String n , Class <? >... pTs ); Method [] getMethods (); Method [] g e t D e c l a r e d M e t ho d s (); VS-Übung Tobias Distler, Michael Gernoth, Reinhard Tartler Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Marshalling & Unmarshalling Analyse einer Klasse Analyse von Attributen Allgemeine Semantik Wert lesen I Zugriff auf public-Elemente einer Klasse I Allgemein I Primitive Datentypen [...] get { Field , Constructor , Method }([...]) [...] get { Field , Constructor , Method } s () I Zugriff auf alle Elemente einer Klasse [...] getDeclared { Field , Constructor , Method }([...]) [...] getDeclared { Field , Constructor , Method } s () VS-Übung VS-Übung Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 java.lang.reflect.Field Object get(Object object); <Datentyp> get<Datentyp>(Object object); z.B. Tobias Distler, Michael Gernoth, Reinhard Tartler Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 getBoolean(), getCharacter(), getInt(),... Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung Marshalling & Unmarshalling Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Analyse von Methoden I java.lang.reflect.Method Methodenname bestimmen Marshalling & Unmarshalling Analyse von Konstruktoren I Konstruktorname bestimmen I Parameter bestimmen I Exceptions bestimmen String getName(); I Parameter bestimmen I Rückgabewert bestimmen I Exceptions bestimmen Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 java.lang.reflect.Constructor<T> String getName(); Class<?>[] getParameterTypes(); Class<?>[] getParameterTypes(); Class<?> getReturnType(); Class<?>[] getExceptionTypes(); Class<?>[] getExceptionTypes(); Tobias Distler, Michael Gernoth, Reinhard Tartler Marshalling & Unmarshalling VS-Übung Modifiers I Tobias Distler, Michael Gernoth, Reinhard Tartler Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 java.lang.reflect.Modifier Anwendbar für I I I I Marshalling & Unmarshalling VS-Übung Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Objekterzeugung/-modifikation/-nutzung Die Java Reflection API bietet Möglichkeiten Klassen Attribute Methoden Konstruktoren I Auslesen I Analyse mittels statischer Methoden der Klasse Modifier I Objekte zu erzeugen I Attribute zu modifizieren I Methoden aufzurufen int m = <Class/Field/Method/Constructor-Objekt>.getModifiers(); if(Modifier.isPublic(m)) {...} I Analog: isFinal(), isStatic(), isTransient(),... Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung Marshalling & Unmarshalling Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Objekterzeugung I Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Objekterzeugung Neue Objektinstanz (java.lang.reflect.Constructor<T>) Spezialfall: Arrays I T newInstance(Object... initargs); I Marshalling & Unmarshalling I Beispiel: 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); [...] } Eigene Reflection-Klasse (java.lang.reflect.Array) Statische Methoden zur Array-Erzeugung I Eindimensional I Mehrdimensional Object newInstance(Class<?> componentType, int length) Object newInstance(Class<?> componentType, int[] dimensions) I Beispiel: String [] stringArray ; stringArray = ( String []) Array . newInstance ( String . class , 10); Tobias Distler, Michael Gernoth, Reinhard Tartler Marshalling & Unmarshalling VS-Übung Attributmodifikation I Marshalling & Unmarshalling I Allgemein Problem: → IllegalAccessException Primitive Datentypen void set<Datentyp>(Object object, <Datentyp> value); z.B. setBoolean(), setCharacter(), setInt(),... I Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Field sf = eo . getClass (). g e tDe c lar ed F iel d (" stringAttr "); sf . set ( eo , " Hello , again "); void set(Object object, Object value); I VS-Übung Attributmodifikation Attribut auf neuen Wert setzen (java.lang.reflect.Field) I Tobias Distler, Michael Gernoth, Reinhard Tartler Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 I Grund: stringAttr ist private I Lösung: I Beispiel: Beispiel: void setAccessible(boolean flag); Field if = eo . getClass (). getField (" intAttr "); if . setInt ( eo , 48); Field sf = eo . getClass (). g e tDe c lar ed F iel d (" stringAttr "); sf . setAccessible ( true ); sf . set ( eo , " Hello , again "); sf . setAccessible ( false ); Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung Marshalling & Unmarshalling Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Marshalling & Unmarshalling Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Methodenaufruf I Aufruf (java.lang.reflect.Method) I Beispiel: Object invoke(Object obj, Object... args); Marshalling & Unmarshalling Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 public String getStringAttr() {} Method m = eo . getClass (). getMethod (" getStringAttr " , new Class [0]); String s = ( String ) m . invoke ( eo , ( Object []) null ); I Näheres in der Tafelübung zu Aufgabe 3... Tobias Distler, Michael Gernoth, Reinhard Tartler Marshalling & Unmarshalling VS-Übung Tobias Distler, Michael Gernoth, Reinhard Tartler Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Marshalling & Unmarshalling Übungsaufgabe 2: Überblick I I Client Implementierung eines Objekt-Stroms I Kommunikationsschicht VS-Übung Deserialisierung ObjectInputStream Skeleton Host B → VSObjectOutputStream V S O b j e c t O u t p u t S t r e a m ( OutputStream out ); OutputStream ge tO utp ut St r eam (); void writeObject ( Object obj ); void reset (); I Stub Serialisierung ObjectOutputStream Server Tobias Distler, Michael Gernoth, Reinhard Tartler Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Übungsaufgabe 2: Aufgabenstellung Ziel: Senden einer Nachricht (Java-Objekt) über eine Socketverbindung Methode: Verwendung eines Objekt-Stroms Host A VS-Übung → VSObjectInputStream V S O b j e c t I n p u t S t r e a m ( InputStream in ); InputStream getInpu tStream (); Object readObject (); Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung Marshalling & Unmarshalling Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Marshalling & Unmarshalling Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Übungsaufgabe 2: Aufgabenstellung Lösungsskizze Implementierung eines Objekt-Stroms VSObjectOutputStream.writeObject() I {S,Des}erialisierung im Objekt-Strom Serializable I verwenden {S,Des}erialisierung im Objekt Externalizable → VSExternalizable public interface VSEx terna lizabl e extends Serializable { public void writeExternal ( V S O b j e c t O u t p u t S t r e a m out ) public void readExternal ( V S Ob j e c t I n p u tS t r e a m in ) } I public void writeObject ( Object obj ) throws [...] { if ( ’ obj ’ wurde bereits gesendet ) { sende ’obj ’ - Handle ; } else { Class objClass = obj . getClass (); if ( ’ objClass ’ ist Array ) { S o n d er b e h a n d l u ng -> Arrays ; } else { sende ’obj ’ als " normales " Objekt ; } } } Nachbildung des Gedächtnis-Mechanismus Tobias Distler, Michael Gernoth, Reinhard Tartler Marshalling & Unmarshalling VS-Übung Tobias Distler, Michael Gernoth, Reinhard Tartler Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Lösungsskizze Marshalling & Unmarshalling VS-Übung Serialisierung & Deserialisierung Serialisierung & Deserialisierung in Java Java Reflection API Übungsaufgabe 2 Testen der Implementierung Objekt senden I Herunterladen des Tests von der VS-Übungsseite if ( ’ objClass ’ implementiert VS Externa lizabl e ) { rufe writeExternal () an ’obj ’ auf ; } else if ( ’ objClass ’ implementiert Serializable ) { for ( alle Attribute ) { if ( Attribut ist als " final " gekennze ichnet || Attribut ist als " transient " gekennzeich net ) { ignoriere Attribut ; } else if ( Attribut ist primitiver Datentyp ) { So nd erb eha n dlung -> primitive Datentypen ; } else { writeObject ( Attribut ); <-- Rekursion ! } } } else { werfe N o t S e r i a l i z a b l e E x c e p t i o n ; } I Senden & Empfangen von VSMessageExample-Objekten 3 Einzeltests Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung I I I I I I Exceptions Einzelnes VSMessageExample-Objekt Mehrere (verkettete) VSMessageExample-Objekte Wichtig: VSObjectOutputStream und VSObjectOutputStream sollen auf beliebige Objekte ausgelegt sein! Was trotzdem (wahrscheinlich) nicht funktioniert: I I Senden & Empfangen von java.lang.String Grund: interne Schachtelklassen Tobias Distler, Michael Gernoth, Reinhard Tartler VS-Übung