Um Objekte in einer Datei speichern zu können, müssen diese in Strings eines bestimmten Formats umgewandelt werden. Diesen Prozess nennt man Serialisieren. Erst wenn die Daten in String-Form vorliegen, können diese in einer Text-Datei gespeichert werden.
Den Umgekehrten Prozess, also das Interpretieren des String-Formates und das Umwandeln der Daten in ein Objekt im Arbeitsspeicher, nennt man Parsen.
Als String-Format kann man sich viele geeignete Formate ausdenken. Für bestimmte Anwendungen sind vor allem Formate wünschenswert, die auch von Menschen verstanden werden und allenfalls sogar mit einem einfachen Texteditor verändert werden können. Die Formate sollen zudem kompakt und erweiterbar sein. Das heisst, wenn sich die Definition eines Objektes ändert, sollen alte Daten trotzdem noch brauchbar bleiben (kompatibilität zwischen Versionen). Zudem soll das Format robust sein, sodass Fehler in einer Datei nicht zu Abstürzen führen.
Ein sich anbietendes Format ist XML, das gerne als Austausch-Format zwischen Applikationen und Computern in einem Netzwerk verwendet wird. Ich habe mich für ein vereinfachtes XML-ähnliches Format entschieden, das alle obigen Anforderungen erfüllt und habe dieses Format WXML genannt.
Hier ein einfaches Beispiel, wie eine Datei im WXML-Format aussehen kann.
<UserList> <User> <Name>admin</> <Password>******</> <Rights>admin</> </User> <User> <Name>autor</> <Password>******</> <Right>edit</> </User> <User> <Name>gest</> <Password>******</> <Right>read</> </User> </UserList>
Jedes Objekt wird mit einem Open-Tag (z.B. <User>) begonnen und mit einem Close-Tag (z.B. </User>) abgeschlossen. Bei Objekt-Properties ist das Abschluss-Tag einfach nur </> (z.B. <Name>gest</>).
Der Tag-Name beschreibt entweder den Objekt-Typ oder einen Property-Namen. Die Daten zwischen Open- und Close-Tag repräsentieren entweder ein Objekt, eine Objekt-Liste oder einfache Property-Werte.
Mit dieser einfachen Syntax lassen sich beliebig komplexe hierarchische Datenstrukturen abbilden.
Das WXML-Format erlaubt Kommentare im HTML-Format:
<!-- Kommentar -->
Das WXML-Format hat eine entsprechende Objekt-Struktur im Arbeitsspeicher, die WXML-Datenstruktur. Diese besteht aus nur einem einzigen Objekt-Typ CXmlTag. Das obige Beispiel kann mit diesem Objekt-Typ wiefolgt abgebildet werden:
Tag: UserList Tag: User Tag: Name = admin Tag: Password = ****** Tag: Right = admin Tag: User : Tag: User :
Jedes Tag hat also einen Namen (UserList, User, Name, Password, Right) und entweder einen Wert oder eine Liste von weiteren Tags. Die entsprechende VbScript-Klasse des wxml-Moduls sieht folgendermassen aus:
class CXmlTag public Name ' as string public Value ' as string public TagList ' as array of CXmlTag : end class
Mit diesem Objekt-Typ lässt sich jede beliebige Hierarchie wie im Beispiel oben bauen.
Bevor Objekte einer Anwendung serialisiert werden können, muss eine Abbildung der Anwendungs-Datenstruktur in eine hierarchische Tag-Struktur erzeugt werden. Dabei müssen nur jene Daten der Anwendung in die Tag-Struktur übertragen werden, die auch gespeichert werden sollen.
Nachdem die Tag-Struktur erstellt ist, kann sie mit einem einzigen Funktionsaufruf Serialize ins WXML-Format serialisiert werden. Der so erstellte String kann dann einfach in eine Datei geschrieben werden.
Nach dem Serialisieren kann die Tag-Struktur gelöscht werden.
Für das Erzeugen der Tags für bestimmte VbScript Datentypen gibt es eigene Funktionen. Damit muss man sich nicht um die Umwandlung der Datentypen in Strings kümmern.
Wenn man eine Datei im WXML-Format in einen String eingelesen hat, kann man diesen String einem Tag-Objekt zum Parsen übergeben. Das Tag-Objekt erzeugt daraus dieselbe hierarchische Tag-Struktur wieder, wie sie beim Serialisieren aufgebaut worden ist.
Die Anwendung kann nach dem Parsen die einzelnen Tags dieser Struktur über die Tag-Namen abfragen und deren Werte wieder in den internen VbScript Datentypen auslesen. Auf diese Weise baut die Anwendung ihre interne Datenstruktur aufgrund der Daten in der Tag-Struktur wieder auf.
Nachdem die Anwendungs-Datenstruktur aufgebaut ist, kann die Tag-Struktur wieder gelöscht werden.