Serialisierung Benedict Fehringer Proseminar Programmiersysteme Betreuer: Guido Tack Übersicht • • • • Einführung Datengraphen und abstrakter Speicher Pickles (Unpickling, Pickling) Bsp. in Java und Alice Einführung Was meint Serialisierung? Serialisierung bedeutet, dass ein Datengraph in eine eindimensionale (lineare)-Form gebracht wird, so dass diese eindeutig in den UrsprungsDatengraph umgewandelt werden kann. Wozu benötigt man Serialisierung? • Speichern • Transferieren • Compilieren Umsetzung der Serialisierung in verschiedenen Sprachen • CLU (eine Sprache, die von Pascal abstammt); (B. Liskov and St. Zilles, 1974) • JAVA (Roger Riggs, Jim Waldo, Ann Wollrath Sun Microsystems, Inc., 1996), Microsoft`s.NET Framework • Ruby oder Python • SML/NJ (A. W. Appel and D. B. MacQueen, 1994), OCaml, Alice • Mozart/Oz Datengraphen und abstrakter Speicher Bsp. für einen Datengraph class A class B A x = new A (); { { B y = new B (); public string s; public int j; x.s = „aaa“; public int i; public A a; x.i = 24; public B b; } x.b = y; } y.j = 45; y.a = x; Bsp. für einen Datengraph object x string „aaa“ int „24“ object y int „45“ Adresse Label Inhalt 0 object x 1|2|3 1 int „24“ 2 string „aaa“ 3 object y 0|4 4 int „45“ Datengraph (formal) Ein Datengraph ist eine endliche Funktion g, so dass gilt: Ran(g) Lab x (Str Dom(g)*) Abstrakter Speicher • Spezielle Datenstrukturen benötigen eine spezielle Repräsentation (Zahlen, Strings, Arrays,...) (kann zur Optimierung implementiert werden) Pickles Definitionen Pickle: - linear - external - „Platform-unabhängige“ Pickling - Umwandlung eines Datengraphen in einen Pickle Unpickling - Umkehrvorgang zum Pickling Konstruktion/Unpickling von Datengraphen • Baum • azyklischer Graph • zyklischer Graph Baum a c b c d Instruktion # Nachfolger c 0 c 0 d 0 b 2 a 2 Baum a c b c d Instruktion # Nachfolger c 0 c 0 d 0 b 2 a 2 Azyklischer Graph a b c d Instruktion # Nachfolger c 0 STORE 0 - LOAD 0 - d 0 b 2 a 2 Azyklischer Graph a b c d Instruktion # Nachfolger c 0 STORE 0 - LOAD 0 - d 0 b 2 a 2 Zyklischer Graph Instruktion a PROMISE 0 a b c d # Nachfolger 2 c 1 STORE 1 - LOAD 1 - d 0 b 2 FULFIL 0 2 Zyklischer Graph Instruktion a PROMISE 0 a b c d # Nachfolger 2 c 1 STORE 1 - LOAD 1 - d 0 b 2 FULFIL 0 2 Pickling • Schritt 1: Datengraph Pickle-Baum • Schritt 2: Pickle-Baum PostorderLinearisierung • Schritt 3: Postorder-Linearisierung Pickle Schritt 1 0: a a 1: c b c Datengraph d -> 0 b -> 1 Pickle-Baum d Schritt 2 0: a b 1: c -> 0 -> 1 Pickle-Baum d Knoten # Nachfolger -> 0 - 1:c 1 -> 1 - d 0 b 2 0:a 2 Postorder-Linearisierung Schritt 3 Knoten Knoten # Nachfolger # Nachfolger -> 0 - PROMISE 0 a 2 1:c 1 c 1 STORE 1 - -> 1 - LOAD 1 - d 0 d 0 b 2 b 2 0:a 2 FULFIL 0 2 Postorder-Linearisierung Bottom-up-Pickle Top-Down-Pickles • Präorder statt Postorder Pickle • Kein Promise/Fulfill nötig Top-Down Verschiedene Darstellungen eines Pickle-Bäume 0: a 1: c -> 0 0: a b -> 1 = d b -> 1 1: c -> 0 d Implementier-Details • Depth First Search (Graph Pickle-Baum Pickle) • Bestimmung der maximalen Stack-Höhe Realisierung in JAVA und Alice JAVA-Objekt-Modell • • • • • Klassen Objekte Felder Methoden ... Pickling in Java • Objekte können serialisiert werden • Top-Down-Mechanismus • Pruning Bsp. für Pickling in Java import public { public public } java.io.Serializable; class A implements Serializable int i; string s; Bsp. für Pickling in Java 10 public class FlattenA 20 { 30 public static void main(String [] args) 40 { 50 A a = new A(); 60 FileOutputStream fos = new FileOutputStream(“aa.ser"); 70 ObjectOutputStream out = new ObjectOutputStream(fos); 80 out.writeObject(a); 90 out.close(); 100 } 110 } Bsp. für Pickling in Java 10 public class InflateA 20 { 30 public static void main(String [] args) 40 { 50 A a = null; 60 FileInputStream fis = null; 70 ObjectInputStream in = null; 80 try 90 { 100 fis = new FileInputStream(“aa.ser"); 110 in = new ObjectInputStream(fis); 120 a = (A)in.readObject(); 130 in.close(); 140 } 150 catch(IOException ex) { ERROR!!!} 160 catch(ClassNotFoundException ex) { ERROR!!! } 170 } 180 } Pruning • der Programmierer kann selbst entscheiden, welcher Teil gepickelt werden soll und welcher nicht. • Die nicht zu Pickelndeln Teile müssen markiert werden Bsp. für Pickling in Java import java.io.Serializable; public class A implements Serializable { transient public int i; public string s; } Pickling in Alice • Pickling beliebiger Daten • Typsicherheit • Anwendung: z.B. Komponentensystem / Compiler Bsp. für Pickling in Alice signature NUM = sig type t fun fromInt : int -> t fun toInt : t -> int fun add : t * t -> t end structure Num :> NUM = struct type t = int fun toInt n = n fun fromInt n = n val add = op+ Bsp. für Pickling in Alice Pickling: Pickle.save: string * package -> unit Pickle.save ("Num." ^ Pickle.extension, pack Num :> NUM) Unpickling: Pickle.load: string -> package structure Num' = unpack Pickle.load ("Num." ^ Pickle.extension) : NUM Bsp. für Pickling in Alice Achtung! Num'.add (Num.fromInt 4, Num.fromInt 5) 1.0-1.39: argument type mismatch: t * t does not match argument type Num'.t * Num'.t because type Num.t does not unify with Num'.t Literaturverzeichnis • Guido Tack, Linearisation, Minimisation and Transformation of Data Graphs with Transients. Diplomarbeit, Saarbrücken, Mai 2003 • Roger Riggs, Jim Waldo, Ann Wollrath Sun Microsystems, Inc., Pickling State in the Java™ System, Toronto, Ontario, Canada, June 1996 • Java Object Serialization Specification. Available from http://java.sun.com/j2se/1.4/docs/guide/serialization/, 2001. • The Alice Project. Available from http://www.ps.unisb.de/alice, 2003. Homepage at the Programming Systems Lab, Universität des Saarlandes, Saarbrücken.