Marshalling

Werbung
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
Herunterladen