Konstruktion von verteilten Objekten: Teil1:Konzepte Abschnitt 1: Verteilte Systeme Wichtige Charakteristika verteilter Systeme Bestandteile verteilter Systeme Ein verteiltes System besteht aus Komponenten auf untereinander vernetzten Rechnern,die über Middleware so interagieren,dass sie insgesamt als ein gemeinsames Systemziel erfüllend erscheinen. Ein Rechner, der Komponenten eines verteilten System beherbergt, wird als Host bezeichnet. Ein Host ist ein Rechner ,der Komponenten eines verteilten Systems ausführt. Middleware ist eine Schicht zwischen Netzbetriebssytemen und nwendungen,die sich Heterogenitäts- und Verteilungsaspekten annimmt. Zentral und verteilt organisierte Systeme im Vergleich – – – – – – – – – Zentral organisierte Systeme besitzen nichtautonome Komponenten. werden oft mittels homogener Techologie gebaut. Ressourcen werden von mehreren Benutzern zeitgleich gemeinsam genutzt. Besitzen einen einzelnen Ausführungsort und Störungsort. Verteilte Systeme besitzen autonome Komponenten können mittels heterogener Technologien gebaut werden Komponenten können exclusiv benutzt werden werden mit nebenläufigen Prozessen ausgeführt besitzen mehrere Störungsorte Anforderungen verteilter Systeme -Skalierbarkeit bezeichnet die Fähigkeit,sich an zukünftig steigende Last anpassen zu können (Verteilte Systemarchitekturen erreichen Skalierbarkeit durch den Einsatz von mehr als einen Hosts) -Offenheit: offene Systeme sind einfach zu erweitern und zu ändern (Verteilte Systemkomponenten erzielen Offenheit durch die Kommunikation über wohl definierte Schnittstellen) -Heterogenität von Komponenten kann von den Programmiersprachen ,den Betriebssystemen,den Hardwareplattformen und den Netzwerkprotokollen herrühren. (Für verteilte Systeme ist die Komponentenheterogenität der Normalzustand) -Gemeinsamer Ressourcenzugriff:oft müssen Ressourcen wie hardware ,Software und Daten,von mehreren benutzern gemeinsam genutz werden. -Fehlertolleranz: ein auch bei Vorhandensein von Fehlern weiterlaufender Betrieb wird als fehlertollerant bezeichnet (wird erreicht durch Replikation) Transparenz in verteilten Systemen: – Zugriffstransparenz bedeutet,dass die Schnittstellen für lokale und entfernte Kommunikation gleich sind – Ortstransparenz bedeutet,dass die Dienstanfordere nichts über physische Orte von Komponenten wissen müssen – Migrationstransparenz bedeutet,dass eine Komponente verlagert werden kann,ohne dass benutzer oder Clients davon Kenntniss nehmen müssen(hängt von Zugriffs und Ortstransparenz ab) – Replikationstransparenz bedeutet, dass Benutzer und Programmierer nicht wissen, ob ein Replikat oder ein Orginal den Dienst erbringt(hängt von Zugriffs und Ortstransparenz ab) – Nebenläufigkeitstransparenz bedeutet, dass Benutzern und Programmierern nicht bewusst ist,dass Komponenten Dienste nebenläufig anfordern. – Skalierbarkeitstransparenz bedeutet,dass Benutzer und Programmierer nicht wissen, wie die Skalierbarkeit eines verteilten Systems erreicht wird (hängt von Replikations und Migrationstransparenz ab) – Performanztransparenz bedeutet, dass benutzern und Programmierern nicht bewusst ist, wie gute Systemperformanz beibehalten wird(hängt von Replikations und Migrationstransparenz ab) – Fehlertransparenz bedeutet, dass benutzern und Programmierer sich nicht bewusst sind, wie verteilte Systeme Fehler verbergen (hängt von Nebenläufigkeits und Replikationstransparenz ab) Zusammenfassung: - Verteilte Systeme bestehen aus mehreren vernetzten Hosts,auf denne jeweils eine oder mehrere Komponenten ausgeführt werden. Diese Komponenten benutzen Middleware zur Kommunikation untereinander.Die Middleware verbirgt in einem gewissen Ausmaß die Verteilung und die Heterogenität vor den Entwicklern. – Entwickler haben oft nicht die Möglichkeit einer zentral organisierten Systemarchitektur, weil nichtfunktionale Anforderungen sie zum Einsatz einer verteilten Architekur zwingen. Zu diesen Anforderungen zählen die Skalierbarkeit,die Offenheit,die Heterogenität,die gemeinsame Ressourzennutzung und die Fehlertolleranz. – Wir haben verschiedene Dimensionen diskutiert, in denen die Verteilung den Benutzern, Anwendungsentwicklern und Administratoren transparent sein kann.Diese Dimensionen sind siehe Transparenz in verteilten Systemen.Diese sind Entwurfszielefür verteilte Systeme. Fragen 1.1- 1.9 Abschnitt 2: Der Entwurf verteilter Objekte Uml-Repräsentationen für den Entwurf verteilter Objekte: -Use-Case-Diagramme erfassen die Anforderungen aus funktionaler Sicht. Akteure sind Typen menschlicher Benutzer oder externer Systeme Ein UCD ist eine generische Beschreibung einer Folge von Interaktionsereignissen zwischen dem System und seinen externen Akteuren -Sequenzdiagramme modellieren Interaktionsszenarien zwischen Objekten als sequenzielle Abfolge ( Nachrichten werden zwischen Client und Serverobjekt versendet,um die Ausführung von Operationen anzufordern) Können während Analyse und Entwurf eingesetzt werden -Klassendiagramme definieren die Typen der Objekte über Attribute, Operationen und Assoziationen. Attribute können öffentlich oder privat sichtbar sein. Ein typ kann einen anderen Typ verallgemeinern. Assoziationen verbinden Objekte und können Aggregations-oder Kompositionssemantik tragen. Abhängigkeiten zeigen,das ein Objekttyp von einem anderen Objekttyp abhängt. Assoziationen können verschiedene Kardinalitäten besitzen. Klassendiagramme werden für die Erfassung von typenbezogenen Abstraktionen in der Analyse und im Entwurf verteilter Objekte benutzt. Pakete werden zur hierachischen Strukturierung der Analyse und Entwurfsinformation verwendet. -Objektdiagramme zeigen Beispiele von Klasseninstanziierung. -Zustandsdiagramme modellieren das dynamische Verhalten von Objekten auf einer typbezogenen Abstraktionsebene Zustände können aus anderen Zuständen zusammengesetzt werden. Ein Metamodell für verteilte Objekte: Metaobjekt Facility Ebene 3 Metaobjekt modell Ebene 2 Objekttypen Ebene 1 Objekte Ebene 0 Objekte - Objekte besitzen Attribute,die ihre zustände repräsentieren und Operationen,die die Zustände ändern können - Ein Attribut ist eine Abbildung zwischen einem Objekt und einem Wert.Es ist durch seinen Namen und seinen typ charakterisiert. Verteilte Objekte haben keine Klassen oder static Variablen - Objekte haben einen eindeutigen Bezeichner und möglicherweise mehrere auf sie zeigende Refernzen Typen -Objekttypen spezifieren die gemeinsamen Charakteristika ähnlicher Objekte. -Objekttypen definieren einen Vertrag ,der die Interaktion zwischen Client und Serverobjekten bestimmt. -Objekte sind instanzen von Objekttypen -Objekttypen sind durch Schnittstellen definiert. Diese legen die von Clients anfragbaren Operationen fest -Eine Signatur spezifiert den Namen, Parameter, Rückgabewert und Ausnahmen einer Operation. Nicht alle von einem Objekttyp unterstützen Operationen müssen in der Schnittstelle enthalten sein. Metamodelle für verteilte Objekte enthalten auch Typen, die nicht Objekte sind! Typkonstruktoren sollten nicht mit Konstruktoren verwechselt werden,die Objekte erzeugen! Anfragen Eine Objektanfrage wird durch ein Clientobjek gestellt, um von einem Serverobjekt die Ausführung einer Operation. Ausnahmen Ausnahmen benachrichtigen Clients über aufgetretene Fehler bei der Ausführung einer Objektanfrage. Untertypen und Mehfachvererbung – – Ein Untertyp erbt alle Attribut-, Operations- und Ausnahmendefinitionen von seinem Obertyp. Ein Untertyp kann von mehr als einem Obertyp erben. Polymorphie -bedeutet, dass ein Attribut oder ein Paramter Instanzen verschiedener Typen refernzieren kann. -Späte Bindung bedeutet, dass erst zur Laufzeit entschieden wird,welche Operation beziehungsweise Operationsimplementierung für eine Anfragenausführung die richtige ist. Lokale und verteilte Objekte im Vergleich Lebenszyklus: Die Erzeugung, Migration und Löschung verteilter Objekte unterscheidet sich von lokalen Objekten. Objektreferenzen: -für verteilte Objekte sind grösser als für lokale Objekte! Latenzzeit von Anfragen: -eine verteilte Objektanfrage ist Größenordnungen langsamer als ein lokaler Methodenaufruf -beim Entwurf verteilter Objekte muss die Latenzzeit von Anfragen berücksichtigt werden Objektaktivierung: -andauernde Verfügbarkeit verteilter Objekte zur bedienung von Anfragen ist nicht garantierbar -Aktivierung bringt inaktive Objekte in den Hauptspeicher, so dass sie eine Objektanfrage bedienen können -der Overhead der Aktivierung vergrößert die Latenzzeit von Objektanfragen beträchtlich -Aktivierung und Deaktivierung sollten transparent sein -Objekte mit Zustand müssen persistent sein Parallelität: -verteilte Objekte werden oft parallel ausgeführt -Nebenläufigkeit muss gegebenfalls kontrolliert werden Kommunikation: -für Anfragen an verteilte Objekte gibt es verschiedene Kommunikationsprimitive ( Kapitel 7) Fehler : -die Wahrscheinlichkeit des Scheiterns verteilter Objektanfragen ist größer als die lokaler Methodenaufrufe -man kann verschiedene Zuverlässigkeitsgrade für verteilte Objekte unterscheiden -Clients müssen prüfen, ob Server eine Anfrage ausgeführt haben Sicherheit: -die Verteilung von Objekten macht sie anfällig für sicherheitsrelevante Angriffe -während des Entwurfes verteilter Objekte müssen Sicherheitsaspekte berücksichtigt werden Zusammenfassung: – Ein Komponentenmodell legt fest, wie Dienste definiert werden,wie der extern sichtbare Zustand einer Komponente ermittelt wird, wie Komponenten identifiziert und Dienste angefordert werden.Durch die objektorientierte Sichtweise dieses Buchs auf verteilte Systeme werden Komponenten als Objekte betrachtet.Objekte kommunizieren mit Objektanfragen.Ein Clientobjek kann vom Serverobjekt die Ausführung einer Operation oder den Zugriff auf ein Attribut anfordern. – UML: Möglichkeit um Objektmodelle aus verschiedenen perspektiven auszudrücken: Use Case Diagramme: Bedarf an Systemschnittstellen identifizieren Sequenzdiagramme: Szenarien von Objektinteraktionen modellieren Klassendiagramme: kann man die statischen Eigenschaften von Klassen formulieren(insbesondere Attribute und Operationen und die Assoziationen einer Klasse zu anderen) Zustandsdiagramme:geben den internen Zustand verteilter Objekte und die Übergänge zwischen diesen Zuständen wieder All diese Diagramme unterstützen den Entwurf verteilter Objekte und vor allem die Kommunikation darüber – Bestandteile eines Metaobjektmodells für verteilte Objekte: - Operationen - Attribute - Ausnahmen - Untertypbildung -Mehrfachvererbung - Polymorphie – Unterschiede im Entwurf von zentralisierten Objekten: - Lebenszyklus verteilter Objekte ist komplexer, da auch Ortsinformation berücksichtigt werden muss -Referenzen auf verteilte Objekte sind komplexer, da sie auch in der Lage sein müssen, Objekte zu lokalisieren, und weil Sicherheits und Typinformation hinzugefügt werden muss - Latenzzeit für Anfrage ist ca 2000 mal größer als der overhead eines lokalen Methodenaufrufs (Objekte müssen gegebenfalls aktiviert werden und auch deaktviert werden, wenn sie länger nicht länger benutzt werden.Dies erhöht wiederum die Anfragen-Latenzzeit. - Verteilte Objekte können Aufgaben potenziell schneller als zentrale Objekte ausführen( Grund: echte Parallelität) - verteilte Objekte können aussfallen, deshalb müssen sowohl Client als auch Serverobjekte so gebaut werden, dass sie Ausfälle tolerieren können. - verteilte Objekte kommunizieren möglicherweise über unsichere Rechnernetze Fragen 2.1 bis 2.12 Kapitel 2:Middleware für verteilte Objekte Primzipien objektorientierter Middleware: Rechnernetze: -Iso / OSI Refernzmodell Die physikalische Schicht beschäftigt sich mit der Übertragung von Bits über ein physikalisches Medium Die Leistungsschicht verbindet zwei Rechner Die Netzwerkschicht realisiert die Verbindung mehrerr Knoten in einem Netz Die Transportschicht kümmert sich um längere Nachrichten zwischen zwei Rechnern Die Sitzungsschicht etabliert und betreibt Verbindungen zwischen verteilten Systemkomponenten Die Darstellungsschicht löst Unterschiede Unterschiede in der Datenkodierung auf und ermöglicht den Transport komplexer Daten Die Anwendungsschicht stellt die Anwendungsfunktionalität bereit. TCP ist ein verbindungsorientiertes, UDP ein verbindungsloses Transportprotokoll. TCP: -bietet zur Kommunikation bidirektionale Ströme zum Hineinschreiben aus Auslesen von Daten -sorgt für Zuverlässigkeit bei unzuverlässigen Netzwerkprotokollen, ist aber weniger effizient als UDP UDP: -können Nachrichten fetser Länge zwischen Hosts eines verteilten Systems gesendet werden -verbessert die Zuverlässigkeit nicht, ist aber effizienter Middlewaretypen: – – – – Transaktionsorientierte Middleware wird oft zusammen mit verteilen Datenbankanwendungen benutzt Objektorientierte Middleware besitzt Fähigkeiten transaktionsorientierte Middleware Message-orientierte Middleware wird dann benutzt, wenn zuverlässige, asynchrone Kommunikation die dominante Form der Interaktion im verteilten System ist objektorientierte Middleware wird zunehmend mit Message-orientiertes Middleware eingesetzt RPC - ein RPC ist ein Hostgrenzen überschreitender Prozeduraufruf - der Ursprung objektorientierter Middleware - die RPC Darstellungsschichtintegration bildet Anwendungsdatenstrukturen in eine homogene und übertragbare Form ab - die Abbildungen zwischen den Kodierungen in den Anwendungen und beim Transport werden Marshalling( packen) und Unmarshalling (entpacken) genannt - Marshalling kann statisch oder dynamisch implementiert werden - Client und Server Stubs sind statische Implementierungen des Marshalling und Unmarshalling - Aktivierungs Policie bestimmen, wie Server in die Lage versetzt werden, Anfragen auszuführen Objektorientierte Middleware - jede Objektorientierte Middleware besitzt eine Schnittstellenbeschreibungssprache - IDLs unterstützen das Konzept von Objekttypen als Parameter, Fehlerbehandlung und Vererbung - die Darstellungsschicht bei objektorientierter Middleware muss Objektreferenzen auf das Transportformat abbilden# - die Sitzungsschicht implementiert die Objektaktivierung in den Objektadaptern - Objektadaper müssen Server neu starten können.DIese registrieren sich bei einem Implementierungsrepository oder einer Registry. - die Sitzungsschicht muss die Operationsauswahl implementieren - die Sitzungsschicht muss Synchronisation realisieren Entwicklung mit objektorientierter Middleware: -Schnittstellenbeschreibung IDLs besitzen Sprachkonstrukte für alle Konzepte ihres zugrunde liegenden Metamodells. Schnittstellenbeschreibung detailieren Klassendiagramme wesentlich Schnittstellen als Verträge zwischen Client und Server Schnittstellen sind die Grundlage für die Verteilung von Typinformation Client und Sercer Stubs werden automatisch aus Schnittstellen abgeleitet -Stubgenerierung Client und Server Stubs sind Proxie für Server und Clients Stubs werden generiert durch den IDL Compiler der Middleware -Implementierung von Clientobjekten Ein Client stellt eine statitische Objektanfrage über den Aufruf einer lokalen Methode eines Client Stubs Stubs sind typisierbar. Compiler können deshalb die typsicherheit prüfen Mit Stubs kann Zugriffstransparenz erreicht werden Die Middleware kann einen Stub umgehen, wenn Server und Client auf dem selben Host liegen -Implementierung von Serverobjekten Der generierte Server Stub muss die vom Anwendungsentwickler entworfene Serverimplementierung aufrufen -Serverregistrierung Serverobjekte müssen in der Registry oder im Implementierungsrepository der Middleware registriert werden Fragen 3.1 – 3.12 Cobra, COM und JAVA/RMI Cobra: ein wichtiges Entwurfsziel von Corba ist das Überwinden von Heterogenität Metaobjektmodell und Schnittstellenbeschreibung: Objekte - Cobraobjekte besitzen einen eindeutigen Bezeichner, können aber Ziel mehrerer Objektreferenzen sein (Objektreferenzen sind persistent;bedeutet das eine Objektreferenz auch bein einem derzeitig deaktivierten Serverobjekt gültig bleibt) Typen - Cobras Objektmodell ist statisch getypt(dh alle Attribute,Paramater und Operationsrückkehrwerte einen statischen Typ besitzen) --> möglichkeit der Typsicherheit - Objekttypen besitzen einen eindeutigen Namen ( Interface) - Cobra unterstützt komplexe Typen, deren Instanzen nicht entfernt zugreifbare Werte sind -Module begrenzen die Gültigkeit von Bezeichnern Attribute -machen die Zustandsinformation von Serverobjekten den Clientobjekten zugänglich -Readonly Attribute können durch Clientobjekte nicht geändert werden -unsterstützt wird auch das Konzept der Konstanten (Readonly Attribute) Operationen - Cobra Objekte spezifieren diejenigen Dienste,die Clients von Serverobjekten anfordern eine Operation besitz einen Rückgabetyp, einen Operationsnamen,eine Liste von Parmatern und und auslösbaren Ausnahmen - können in-,out- und inout-Parameter besitzen (in spezifiziert,dass der Client einen aktuellen Wert liefert,out bedeutet der Server produziert einen Wert währen der Anfrage;inout übergabe eines aktuellen Paramters,der durch den Server modifiziert wird) -es gibt kein Überladen um Programmiersprachenanbindungen nicht zu komplizieren Anfragen – werden benutzt für den Aufruf einer bestimmten Operation bei einem Serverobjekt – statische Anfragen sind zur Übersetzungszeit des Clients definiert – dynamische Objektanfragen werden zur Laufzeit des Clients definiert – die Ausführungssemantik ist „at-most-once“( bei einem Client angezeigten Fehler das Serverobjekt die angefragte Operation nicht ausgeführt hat; wird kein Fehler angezeigt kann der Client davon ausgehen das die Operation ausgeführt worden ist) Fehlerbehandlung – bei auftreten eines Fehlers löst Cobra eine Ausnahme aus Untertypen und Mehrfachvererbung – Cobra unterstütz Mehrfachvererbung – jedes Cobraobjekte erbt von Object. Polymorphie – arbeitet mit statischer Typisierung Architektur – Marshalling und Unmarshalling wird durch Client Stubs und Implementierungsskeletons durchgeführt – Objektadaper unsterstützen die Objektaktivierung und -deaktivierung – die ORB Schnittstelle enthält das Schnittstellenrepository und wird verwendet für die Initialisierung von Clients und Servern – Cobra bietet Zugriffs und Ortstransparenz COM Com unterstützt binäre Verkapselung( dh Kodierung von Serverobjekten in Maschinencode sich unabhängig von den Clients entwickelt) COM definiert das Speicherlayout von Objekten. Damit produzieren unterschiedliche Compiler interoperablen Binärcode Metaobjektmodell und Schnittstellenbeschreibung Objekte – COM Schnittstellen besitzen eindeutige physikalische Bezeichner ( UUID) – COM Objekte werden durch zeiger auf Hauptspeicherebene identifiziert, an denen das Objekt oder ein Proxy liegt – COM Implementierungen können mehrere Schnittstellen gleichzeitig implementieren – COM Klassen managen den Lebenszyklus und können Objekte lokalisieren – COM benötigt keinen Modulmechanismus Typen – COM Grundtypen sind atomare Typen und Typkonstruktoren – hat weniger Typkonstruktoren als COBRA Attribute – behandelt Attribute als Operationen Operationen – die in einer Schnittstelle deklarierten Operationen sind für alleClients sichtbar – COM Operationem besitzen in-, out-, inout Parameter Anfragen – HRESULT kennzeichnet eine erfolgreiche oder fehlerbehaftete Anfrage – COM unterstützt statische und dynamische Operationsaufrufe – „at most once“ Fehlerbehandlung – gegenüber COM sind HRESULTs ausdruckschwächer, um Fehlergründe zu erläutern Vererbung – COM unterstützt das Erbene von genau einer Schnittstelle – jede COM-Schnittstelle erbt von Iunknown Polymorphie – Type coercion bedeutet, dass Typumwandlungen durch die Operation QueryInterface unterstützt werden – Marshalling und Unmarshalling werden durchgeführt durch Objektproxies, Schnittstellenproxies, Objekt-Stubs und Schnittstellen Stubs – Aktivierung und Deaktivierung werden durch den Service Control Manager implementiert – COM unterstützt Zugriffs und Ortstransparenz JAVA/ RMI – Java besitz keine Schnittstelenbeschreibungssprache,sondern verwendet für diesen Zweck – auch Java Pakete in Java schränken Gültigkeitsbereich von Deklarationen ein (Gültigkeitsbereich muss bei jedem Auftreten mittels des Paketnamens angegeben werden) Objekte Mit Java kann ein Clientobjekt Methoden eines entfernten Serverobjekts aufrufen. Client und Serverobjekt sind dabei in Java geschrieben. Lokale Methoden werden durch eine Klassendefintion bestimmt. Typen Java ist eine streng typisierte Sprache und besitz eine statisches Typsystem. Sie bietet atomare Typen und Objekttypen. Zu den atomaren Typen gehören bspweise int, float, double und char. Die objekttypen in Java sind die Klassen und Schnittstellen. Soll ein Serberobjekt entfernt zugreifbar sein, muss es mindestens eine Java Schnittstelle implementieren,die die vordefinierte Schnittstelle java.rmi.Remote direkt oder indirekt erweitert. Remote deklariert keine Operationen , dient aber als Abstraktion für eine entfernte Zugangsmöglichkeit. Attribute Rmi besitzt keine Mechanismen für Attribute. Operationen: Operationen werden in Java als Methoden bezeichnet. Parameter entfernter Methoden dürfen keine Typen entfernter Klassen beinhalten. Die Parameterübergabe atomarer Typen geschieht im Call by Value für lokale wie auch entfernte Methoden. Dies bedeutet das die aufgerufene Methode mit einer Kopie des Werts arbeitet. Objekte werden per Call by Reference für lokale Methodenaufrufeübergeben. Dies bedeutet, dass nicht das Objekt an die aufgerufene Methode übergeben wird, sondern eine Objektreferenz Parameter Atomarer Typ Nicht entfernter Objekttyp Entfernter Objekttyp Lokaler Aufruf Call by Value Call by Reference Call by Reference Entfernter Aufruf Call by Value Call by Value Call by Reference Anfragen Entfernte Methoden werden mit At-most-once-Semantik ausgeführt – im Gegensatz zu Corba und Com unterstützt Java keine Definition von entfernten Methodenaufrufen zur Laufzeit Fehlerbehandlung – Entfernte Methoden müssen deklarieren, dass sie RemoteException auslösen könnten – entfernte Methoden können zusätzliche Ausnahmen auslösen – Untertypen und Mehrfachvererbung Entfernte Schnittstellen können gleichzeitig von entfernten und nicht entfernten Schnittstellen erben. Polymorphie Java unterstütz durch Vererbungsbeziehungen statisch eingeschränkte Polymorphie. Variablen, Paramter und Ergebnistypen haben einen statischen Typ. Zuweisungen zu denen sind möglich, wenn der statische Typ ein Obertyp des statischen Typs des zugewiesenen Objekts ist. Diese Bedingung gewährleistet die Typsicherheit. Architektur: siehe buch seite 156 Kapitel 5: Auflösung der Heterogenität: Unterschiede in Objektmodellen – Typsysteme von Programmiersprachensprachen unterschieden sich – Unterschiedliche Programmiersprachen besitzen unterschiedliche Typkonstruktion – Einige Sprachen unterscheiden zwischen Schnittstelle und Implementierung – Sprachen behandel Vererbung unterschiedlich Maschinencode: – Die von Compilern derselben Sprache erzeugten Binärkodierung kann sich unterscheiden – Die Kodierung in Maschinencode – Das Speicherlayout von Objekten und die Position von Attributen können sich unterscheiden Programmiersprachenanbindungen: Eine Programmiersprachenanbindung legt fest , wie IDL Konstrukte in einer Implementierung eines Client oder Serverobjekts verwendet werden können – Reduktion der Komplexität durch Schnittstelenbeschreibungssprache IDL Seite 169 Abbildung der Objektmodelle: – – – – – – – – – – Die Anbindungen von Programmiersprachen zu einer IDL muss bidirektional sein ( Hin und Zurück) Verteilte Objektmodelle sind statisch typisiert Objekttypen sind als Schnittstelle definiert, die Anbindungen der Programmiersprachen bilden die Objekttypen der Middleware auf die Typen der Client und Server Stubs Anbindungen definieren, wie Objektreferenzen implemntiert sind in den meisten Programmiersprachenanbindungen sind die Objektrefernezkodierungen des Serverobjekts in Clientstubs gekapselt Attribute werden immer als Operationen deklariert Operationen als Prozeduren oder Methoden (sind über Stubs erreichbar) Ausnahmen werden als Ausnahmen oder explizite Ausgabenparameter dargestellt, die ausgewertet werden müssen Auflösung von Mehrfachvererbung hängt vom Vererbungsmodell der Programmiersprache ab Alle Programmiersprachenanbindungen setzen die Existenz eines gemeinsamen Wurzelobjekts vorraus Implementierung von Sprachanbindungen – Middleware stellt für Client und Serverobjekte APIs zur Verfügung – Middleware beinhaltet auch IDL Compiler zur Erzeugung von Programmcode für Stubs und Implementiereungs Skeletons Zugriffstransparenz: Die auflösung der Sprachheterogenität ist transparent für die betroffenen Programmierer Heterogene Middleware – – – – Unterschiedliche Middleware wird uU aufgrund verfügbarer Programmiersprachenanbindungen benötigt aufgrund der Integration mit bestehenden Systemen benötigt aufgrund der Verfügbarkeit auf unterschiedlicher Hardware benötigt aufgrund unterschiedlicher Performanzprofile benötigt Beisiele für Heterogenität: – Die Objektmodelle und IDLs unterscheiden sich – Objektreferenzen werden unterschiedlich kodiert – Datenhetrogenität wird auf unterschiedliche Art aufgelöst – Es werden verschiedene Transportprotokolle verwendet Interoperabilität: bezeichnet die Fähigkeit, dass verschiedene Middlewareimplementierungen zusammenarbeiten können. Brücken: – übersezten eine Anfrage von einer Middleware zu einer anderen – innerhalb einer Middleware angesiedelte Brücken werden Inlinebrücken genannt – die oberhalb einer Middleware angesiedelt sind, nennt man Brücken auf Anfrageneben (request-level bridges) können von Anwendungsentwicklern hinzugefügt werden Zusammenarbeit: Zusammenarbeit legt fest, wie verschiedene Middleware Standards miteinander integriert werden – ist schwieriger zu erreichen als Interoperabilität – Zusammenarbeitsspezifikationen werden duch Compiler realisiert, die von einer IDL in eine andere Übersetzen Heterogene Datenkodierung: – Integer werden auf unterschiedlicher Hardware unterschiedlich kodiert – es gibt verschiedene Kodierungsschemata für Zeichenintervalle (little und Big Endian) – komplexe Datentypen werden in verschiedenen Programmiersprachen unterschiedlich kodiert – Middleware sollte die Konvertierung der Daten transparent vornehmen Eine Standarddatenkodierung ist ein vereinbartes Zwischenformat Verschiedene Möglichkeiten die Heterogenität aufzulösen: – Darstellungsschicht – Anwendungsschicht – durch die Plattform (virtuelle Maschine) Zusammenfassung drei Dimensionen wo Heterogenität auftreten kann: – unterschiedliche Programmiersprachen – unterschiedliche Middleware – unterschiedliche Datenkodierungsverfahren – – – – – – Corba und Com lösen Programmiersprachenheterogenität dadurch auf, dass sie ein gemeinsames Objektmodell definieren und eine Schnittstelenbeschreibungssprache anbieten Die Implementierung der Sprachanbindungen erreicht man durch APIs und IDLs Compiler Middlewareheterogenität wird mittels Interoperabilitäts und Zusammenarbeitsspezifikationen aufgelöst Zusammenarbeitsspezifikationen bestimmen, wie unterschiedliche Middleware systeme sich an einer Objektanfrage beteiligen. Eine solche Spezifikation hat festzulegen, wie die Objektmodelle der teilnehmende Middleware aufeinander abgebildet werden Eine Auflösung in der Darstellungsschicht bildet Heterogene Datenkodierungen auf eine standardisierte Form ab, wie z.B XDR CDR NDR Eine Auflösung in der Anwendungsschicht durch explizite Datenkodierung mit den Objektanfragen mitgesendet werden z.b XML Dynamische Objektanfragen: – – Eine zur Übersetztungszeit des Clients definierte Objektanfrage ist eine statische Anfrage Eine zur Laufzeit des Clients definierte Objektanfrage ist eine dynamische Anfrage jede Objektanfrage muss folgende Punkte festlegen: 1. das Serverobjekt, von dem die Ausführung einer Operation angefragt wird 2. den Name der Operation, deren Ausführung angefragt wird 3. die aktuellen Parameter der angefragten Ausführung 4. eine Datenstruktur, die für die Ergebnisse der Operation bereitgestellt wird Dynamische Objektanfragen sind anfällig für Typunsicherheit Clients benötigen Reflection Schnittstellen, um zur Laufzeit Typinformationen aufzurufen Reflection Clients müssen ermitteln,ob die Server die Operation unterstützen, die sie dynamisch anfragen Prinzipien: – Reflection Schnittstellen bieten Details über den Typ der Serverobjekts zum Zeitpunkt der Ausführung an – Reflection Schnittstellen strukturieren Typinformation gemäß der Schnittstellenbeschreibungssprachen – Der IDL Compiler sammelt Reflection Information und speichert sie persistent Das Corba Schnittstellen Repository – Reflection wird in Corbas Schnittstelle unterstüzt – Operationen des SchnittstellenRepositorys spiegeln sich im abstrakten Syntaxbaum der IDL wieder – Typen des Schnittstellenrepositories sid in CORBA/ IDL definiert Dynamische Objektanfragen sind teuer in der Entwicklung und laufen langsamer – – Dynamische Aufrufe sind von Natur aus unsicher, weil der Namer der angefragten Operation als Zeichenkette oder Token verschlüsselt sind Reflection Mechanismen sind nötig um den Typ eines Serverobjektes zu ermitteln und um Typsicherheit zu gewähren Fortgeschrittene Kommunikation zwischen verteilten Objekten: Synchronisierung von Anfragen: Prinzipien: – Synchrone Anfragen blockieren den Client, bis der Server die Ausführung beendet hat – Nichtsynchrone Anfragen werden benötigt, um die Blockierung von Clients zu vermeiden – Einweganfragen geben die Kontrolle unmittelbar an den Client zurück und Client und Server werden nicht synchronisiert – verzögert synchrone Anfragen geben dem Client die Kontrolle sofort zurück und der Client ruft die Ergebnisse später mit aktivem Warten ab (Nachteil: bei der Ergebnisermittlung den Clients die Synchronisierung mit dem Server obliegt.Dabei kann insbesondere der Fall eintreten , dass zum Zeitpunkt des Aufrufs der Operation das Ergebnis nocht nicht vorliegt.Dann ist der Client blockiert oder die Anfrage muss erneut aufgerufen werden dh Polling ( aktives Warten)) – Asynchrone Anfragen geben die Kontrolle unmittelbar an den Client zurück und der Server ruft den Client zur Übermittlung des Ergebnisses auf ( Callback) – Nichtsynchrone Anfragen können durch Kombination von synchronen Anfragen und Multithreading erreicht werden Einweganfragen: ( Verwendung von Threads) – Die Blockierung des Hauptthreads kann verhindert werden, indem der synchrone Aufruf in einem neuen Thread getätigt wird – zur Vermeidung der Clientblockierung können Threads mit COM, Corba, Java verwendet werden Unterschied zwischen Einweganfragen und verzögert synchronen Anfragen besteht dadrin, dass der Client einige Zeit nach dem senden der Anfrage vom Request Objekt eine Operation get response aufruft. Damit werden Server und Clienr synchronisiert. Das Ergebnis ist dann in einer Datenstruktur verfügbar, die während der Operation create_request übergeben wurde. Asynchrone Anfragen: – können mit Hilfe von synchronen Anfragen und Threads implementiert werden Gebrauch von Nachrichtenschlangen: – realisieren asynchrone Anfragen. Sie müssen persistent gespeichert werden – arbeitet nach dem First in First out Prinzip und garantiert, dass Nachrichten in der gleichen Reihenfolge entnommen werden, in der sie auch angefügt wurden – eine Antwortschlange dient der Übertragung und Zwischenspeicherung der Antworten Anfragen-Multiplizität: – eine Unicast Anfrage geht von einem Clientobjekt an ein einziges Serverobjekt Die Anfrage eines Clients an mehrere Verschiedene Objekte zur Ausführung ein und derselben Operation wird Gruppenanfrage genannt – – Die Gruppenzusammensetzung wird von einem Kanal verwaltet und ist dem Client unbekannt Gruppenanfragen sind anonym Gruppenanfragen können mit Hilfe von synchronen Anfragen implementiert werden Multianfragen: – rufen Operationen von mehreren dem Client bekannten Serverobjekt auf – bei einer Multianfrage kann der Client Ergebnisse dann einsammeln, wenn sie verfügbar werden – können unter Verwendung von Tupelräumen implementiert werden – die Verwendung von Threads geht einher mit mit Performant und Entwicklungsoverheads Zuverlässigkeit von Anfragen: Unicast Anfragen: – exactly-once (dt genau einmal, werden garantiert genau einmal durchgeführt. Schwer zu erreichen und kostspielig) – atomic (dt atomar, entweder vollständig oder gar nicht) – at last once ( mindestens einmal, garantiert einmal, aber möglicherweise auch öfter) – at most once (höchstens einmal, benachrichtigen den Client wenn ein Fehler auftritt) – maybe (vielleich, weiss der Client nicht ob die Anfrage ausgeführt wird!) Gruppen und Multianfragen: – k-Zuverlässigkeit( mindestens k angefragte Operationem werden ausgeführt) – total geordnet( verhindern Anfragen am Überholen vorangegangener Anfragen) – bestmöglich( geben keine Garantie hinsichtlich der Dienstgüte vgl maybe) Zusammenfassung: – Anfragen in Java COM Corba sind per Voreinstellung unicast und synchron und werden at most once ausgeführt. Clients müssen Server mit einer Objektreferenz identifizieren – Einweganfragen werden niemals synchronisiert – verzögert synchrone Anfragen werden von den Clients mit Hilfe aktiven wartens synchronisiert (polling) – asynchrone Anfragen werden vom Server synchronisert – das senden von Multianfragen kann die Performanz von Anfragen erhöhen, da zum einen der Kommunikationsoverhead zwischen Client und Server reduziert wird und zum anderen die Clients die Wartezeit auf Ergebnisse verringern, weil sie sie in der Reihenfolge bearbeiten, wie sie verfügbar werden – Multianfragen können unter Verwendung von Tupelräumen, synchronen Anfragen und mehreren Threads in allen Formen realisiert werden Lokalisieren verteilter Objekte: Prinzipien des Naming: – ein Name ist eine Folge von Bezeichnern, die an eine Objektreferenz gebunden ist und die in die Referenz aufgelöst werden kann – Namensräume müssen hierarchisch strukturiert sein – die hierarchische Struktur erreicht man durch geschachtelte Namenskontexte Namensoperationen: – – – – – – – – – bind (führt eine neue Namensbindung für ein Objekt ein und wird von Administratoren benuzt, um ein Serverobjekt bei einem Nameserver zu registrieren; besteht aus zwei Parametern: Namen, Objektreferenz) resolve( gibt eine Objektreferenz für einen Namen zurück) list( alle in einem bestimmten Namenskontext definierten Namensbindungen) Es muss nicht jedes Serverobjekt an einen Namen gebunden werden Für das selbe Objekt können verschiedene Namen definiert werden Nameserver müssen ihre Namensräume persistent speichern Nameserver sollten auf effiziente Namensauflösung optimiert werden Eine Förderation von Namensservern besteht aus verknüpften Namenskontexten auf unterschiedlicher Middleware Ein Naming handbuch definiert das Layout des Namensraums Objekt Trading: – Clients können nicht immer ihre Server per Namen identifizieren Prinzipien des Objekt Tradings: – Teilnehmer am trading können Dienste exportieren, importieren oder sie vermitteln Spezifikationen von Diensttypen: – Diensttypen definieren Funktionalität und Güte von Diensten – Eigenschaften unterstützen die Definition der Dienstgüte – Eigenschaften sind als Eigenschaftstypen von Diensten definiert – Diensttypen definieren Name, Objekttyp und eine Menge von Eigenschaftstypen – die wesentlichen Trading Operationen sind register( Export von Diensten, withdraw( zuvor registrierte Dienste zu widerrufen) , query( nach Diensten fragen) and change( Eigenschaften von zuvor registrierten Diensten ändern) – Tradingrichtlinien bestimmen, wie Anfrageergebnisse behandelt werden – föderierte Trader exportieren und fragen gegenseitig nach Diensten Im Trading bestimmt ein Diensttyp einen Schnittstellentyp und eine Menge von Eigenschaftstypen. Ein Angebot ist eine Instanz eines Diensttyps. Ein Trader verwaltet eine Angebotsdatenbank, die Dienstangebote und ein Repository für Diensttypen enthält. Trader haben zwei Arten von Clients: Exporter und Importer – Exporter registrieren Angebote beim Trader. Der Trader fügt dieses Angebot seiner Angebotsdatenbank hinzu. Während des Exports werden Werte für alle obligatorischen Eigenschaftstypen des Dienstes zur Verfügung gestellt. Auf dieseweise können Exporter eine bestimmte Dienstgüte zusichern – Importer benutzen Dienstypen, Constraints, Richtlinien und Vorgaben, um den Trader zu fragen. Trader antworten auf Anfragen, indem sie eine Folge von Angeboten aus ihrer Datenbank zurückgeben, die dem Diensttyp entsprechen und sich an die Constraints und Richtlinien halten. Die Folge ist gemäß der Vorgaben sortiert. Der Lebenszyklus verteilter Objekte: Objektlebenszyklus: Erzeugung verteilter Objekte: Konstruktoren objektorientierter Programmiersprachen kann man den Ort neuer Objekte nicht mitgeben – Sicht des Cliententwicklers Eine Fabrik ist ein Objekt, das andere Objekte erzeugt. Eine abstrakte Fabrik verbirgt die Details der Erzeugung und wird in konkreten Fabriken verfeinert. 1. Ein Fabrikfinder ist ein Objekt, das eine Fabrik lokalisiert 2. Der Gebrauch von Fabriken ist unabhängig von der Middleware – Sicht des Serverentwicklers auf die Erzeugung 1. Serverentwickler müssen Fabriken entwerfen, die Fabriken erzeugen 2. Fabriken registrieren Objekte bei der Middleware und erhalten für diese Objektreferenzen 3. Die Registrierung wird unter Verwendung der Middleware Schnittstelle geleistet 4. Die Fabrik muss due Aktivierungsstrategie für das Objekt festlegen – Sicht der Administratoren auf die Erzeugung 1. Der ausführbare Code des Fabrik und des Fabrikfinders wird bei der Middleware registriert 2. der Fabrikfinder muss in den Namens- oder Tradingdienst eingefügt werden Migration von Objekten an entfernte Orte: Objektmigration bezeichnet das Kopieren oder Verschieben eines Serverobjekts von einem Rechner auf einen anderen. Middleware kann Migration nicht vollkommen transparent implementieren( Zielort bestimmen nicht möglich, kein Wissen über Datenstrukturen, Herkunfts und Zielhost können heterogen sein) – – – Sicht der Cliententwickler auf die Migration 1. Clientprogrammierer brauchen nur eine einzige Schnittstelle, um jeden Typ von Objekt migrieren zu können 2. Die Migration benuzt Fabriken zum Erzeugen von Objekten auf entfernten Hosts und Fabrikfinder als Ortsproxies Sicht der Serverentwickler auf die Migration 1. Jedes migrierbare Objekt muss Lebenszyklusoperationen implementieren 2. Neue Kopien müssen sowohl für das Kopieren als auch fpr das Verschieben von Objekten erzeugt werden 3. Die Auflösung der Datenheterogenität während des Attributtransfers verwendet die in Kapitel 5 besprochenen Mechanismen 4. Verschiebeoperationen müssen die Objektreferenz übertragen, um Migrationstransparenz zu erreichen 5. Heterogenität des Maschinencodes wird durch die Registrierung von Fabriken und Objektimplementierungen auf verschiedene Hosts aufgelöst Sicht des Administrators auf die Migration Die Administrationsaufgaben bei Migration sind dieselben wie bei der Erzeugung Orts und Migrationstransparenz: – Migration ist transparent für Client-, aber nicht für Serverentwickler – Fabrikfinder schaffen Ortstransparenz – Migration schafft keine Replikationstransparenz Löschen von Objekten: Referenzielle Integrität bedeutet, dass die Gültigkeit von durch einen Client gehaltenen Referenzen auf ein Serverobjekt garantiert ist! – Sicht des Cliententwicklers auf die Löschung 1. Speicherbereinigung bedeutet die implizite Löschung von nicht länger benötigten Objekten – – 2. Destruktoren sind Objekte, die definieren, was getan werden muss, wenn ein Objekt gelöscht wird 3. Referenzielle Integrität kann nicht über die Middleware Grenzen hinaus gewährleistet werden Sicht der Serverentwickler auf die Löschung 1. Objekte müssen ihre Verfügbarkeit als Dienstanbieter bei der Middleware widerrufen 2.Objekte müssen Resourcen freigeben Sicht der Administratoren auf die Löschung 1. Administratoren müssen die Löschung von Instanzen und die Löschung von Typen bedenken 2. Instanzlöschung beinhaltet das Entfernen von Objektreferenzen aus dem Ortsdienst 3. Die Löschung des Objekttyps beinhaltet eine Reihe von Aktivitätem - Löschung aller Fabriken, die Instanzen des Typs erzeugen - Löschung des Typs dieser Fabrik - Entfernung des Objekttyps aus dem Schnittstellen- Repository - Entfernung der Objektimplementierung aus dem Implementierungs- Repository Zusammengesetzte Objekte: Oft hat eine Gruppe von Objekten denselben Lebenszyklus. Sie zusammenzusetzen, ermöglicht es uns, Lebenszyklusoperationen auf die Gruppe anzuwenden Modellierung der verteilten Objektkomposition: Uml- Klassendiagramme liefern Administratoren und Programmierern eine Modell für die Komposition von Objekten Implementierung der komposition verteilter Objekte: – – Komposition sollte unter Verwendung eines Beziehungsdienstes implementiert werden Beziehungen sollten eigenständige Objekte sein Basisbeziehungen Ein Rollenobjekt ist ein Proxy für ein Objekt, das an einer Beziehung teilnimmt. Beziehungen werden von Fabriken erzeugt, die Kardinalitäts, Grad und Typisierungseinschränkungen prüfen Objekte die in einer Beziehung zueinander stehen, verwenden Rollen und Beziehungen Der Grad definiert, wie viele Rollen eine Beziehung hat Typisierungsbedingungen schränken die Objekttypen ein, die Rollen referenzieren können Graphen aufeinander bezogener Objekte Beziehungsdienste können Algorithmen zum Durchlaufen von Graphen implementieren Referenz und Enthaltenseinbeziehungen Ein Beziehungsdienst kann eine direkte Implementierung für die Semantik von UML Kompositionen liefern Der Lebenszyklus zusammengesetzter Objekte betrifft die Migration und die Löschung zusammengesetzter Objekte Definition einens zusammengesetztes Objekt: – ein zusammengesetztes Objekt wird durch einen Wurzelknoten bestimmt – Alle Rollenobjekte, die im transitiven Abschluss der Enthaltenseinbeziehungen liegen, gehören zum Objekt – – – – Alle Enthaltenseinbeziehungenobjekte, die mit diesem Knotenobjekten verbunden sind, gehören zum zusammengesetzten Objekt Alle Knotenobjekte, die mit den Rollenobjekten im zusammengesetzten Objekt verbunden sind, gehören zum zusammengesetzten Objekt Alle Serverobjekte, auf die Knoten verweisen, gehören zum zusammengesetzten Objekt Eine tiefe Lebenszyklusoperation ist eine Operation, die auf ein zusammengesetztes Objekt und alle in ihm enthaltenen Beziehungs und Rollenobjekte angewand wird Zusammenfassung: - Die vier Lebenszyklusoperationen sind: Erzeugen, Kopieren, Verschieben, Löschen von Objekten - Objekterzeugung wird von Fabriken unterstützt. Eine Fabrik ist ein verteiltes Objekt, das - - Operationen exportiert, die neie Objekte erzeugen. Die neu erzeugten Objekte operieren anfangs am selben Ort wie die Fabrik - Fabrikfinder werden werden von Migrationsoperationen genutzt, um den Ort des Hosts auf eine Weise zu bestimmen, die sowohl für den Client als auch für den Server transparent ist - Objektlöschung kann explizit oder implizit durchgeführt werden. Objekte werden explizit gelöscht, wenn autorisierte Clients eine Löschoperation anfragen. In diesem Fall müssen Clients referenzielle integrität sicherstellen. Objekte werden von der Middleware implizit gelöscht, wenn kein Clientobjekt eine Referenz auf das Objekt besitzt Objektpersistenz: Ein Persistenzdienst hilft Entwicklern von Serverobjekten, Persistenz zu implementieren Persistenz ist die Fähigkeit eines Objektzustands, das Ende des das Objekt ausführenden Prozesses zu überleben (standbehaftete und zustandslose Objekte) – – – – Zustandsbehaftete Objekte besitzen in ihrer Implementierung Instanzvariablen. Entwickler eines Serverobjekts müssens Persistenz implementieren Persistenzdienste verbergen die Details der Datenspeicherung vor Serverobjekten um Persitenz zu erreichen, müssen Daten aus dem Hauptspeicher in einen Sekundärspeicher (swap) Persistenzdienste – – – – – – – – Definnitionssprachen für Persistenzdienste definieren Objektpersistenz unabhängig von einem Datenspeicher Datenspeicher sind Speichertechnologien, die benutzt werden,um Persistenz von Daten zu erreichen Storagetypen definieren die Repräsentation der Storagetypen Storagetypspezifikationen sind Schnittstellen zu Storage-Objekten Eine Storage Objekt Inkarnation ist eine Repräsentation eines Storage-Objekts in einer Programmiersprache Ein Storage- Home regelt die Lebenszyklen der Typen von Storage Objekten. Seine Schnittstelle wird in einer Storage Home Spezifikation definiert Storage Home Inkarnationen sind Repräsentationen von Storage Homes in einer Programmiersprache Um Storage Objekte effizient identifizieren zu können, können Persitenzdienste das Konzept – – der Schlüssel unterstützen Eine Sitzung ist eine logische Verknüpfung zwischen Datenspeicher und einem Prozess, der ein Serverobjekt ausführt Persistenzdienste müssen mit Objektadaptern integriert werden Eine Persistenzdienststruktur: – Die Sitzungsverwaltung des Persistenzdienstes muss mit der Sitzungsverwaltung des Datenspeichers integriert werden( öffnen,schliessen von den Dateien) – Eine Schema ist eine Typdefinition von Informationen, die in einer für den jeweiligen Datenspeicher spezifischen Sprache definiert werden – Implementierungen von Serverobjekten sind von Schemata unabhängig und daher nicht an eine bestimmte Datenspeichertechnologie gebunden – Storage Objekt und Storage Home Inkarnationen sind abhängig von der Datenspeichertechnologie Erzeugen von Architekturkomponenten Storageobjekt und StorageHome Inkarnationen können automatisch erzeugt werden (PSSDL Compiler) Der PSSDL Compiler macht Serverobjekte von Datenspeichern unabhängig Datenspeichertechnologie für Persistenz: Dateien können Daten sequenziell oder in strukturierter Form speichern Relationale Datenbanken enthalten eine Menge von Tabellen, deren Struktur ein einem relationalen Schema definiert ist Trotz der Strukturunverträglichkeit sind relationale Datenbanken aufgrund ihrer Marktdurchdringung am meisten verbreitet – – – – – Zusammenfassung die gebräuchlichsten Formen der Herstellung von Persistenz sind die Verwendung von Dateisystemen, relationalen Datenbankverwaltungssysteme oder Objektdatenbanken als Datenspeicher, die Daten auf einem Sekundärspeicher abbilden Die Verwendung eines Dateisystems umfasst die Serialisierung von Objektrrepräsentationen in Ströme, die dann in einer Datei gespeichert werden Relationale Datenbanken stellen Persistenz durch die Speicherung von Objektattributen in Tabellen her. Damit ist eine objektrelationale Abbildung verbunden ,die zu einer Strukturunverträglichkeit führen kann Objektdatenbanken vermeiden diese Strukturunverträglichkeit durch dich unmittelbare Abbildung von strukturierten Objekten in einen Sekundärspeicher.