Mittwoch, 23. Mai 2012


Artikel

September 2009 | Artikel

Going Live! Fortsetzung, Teil 4

Teil 1   Teil 2   Teil 3   Teil 4   Teil 5   

Eigene Datenmodelle im Mesh

Drei Klassen bilden das einfache, grundlegende Datenmodell von MeshPhotoShare: Photo, PhotoUserData und MeshData. In Photo wird das eigentliche Bild vom Typ BitmapImage gespeichert, zudem ist ein Objekt der Klasse PhotoUserData enthalten. In dieser zweiten Klasse sind die Metadaten (Titel und Beschreibung des Fotos) als string abgelegt. In einer weiteren Eigenschaft von Photo wird die Referenz auf den DataEntry gespeichert, welcher dem Foto im Mesh entspricht. Sowohl Photo/ als auch PhotoUserData implementieren das INotifyPropertyChanged-Interface, damit Änderungen im UI unmittelbar ins Mesh geschrieben werden können. Die dritte Klasse MeshData beinhaltet eine Liste von Fotos als ObservableCollection, um ein Two-Way-Binding der Fotos an die Silverlight-UI durchführen zu können. Abbildung 6 stellt dieses grundlegende Datenmodell als Klassendiagramm dar.

Grundsätzliches Ziel ist es, jedes Foto als einzelnes DataEntry-Objekt im Mesh zu speichern. In der Klasse DataEntry gibt es dabei verschiedene Möglichkeiten der Daten-Speicherung. Binärdaten jeglicher Art lassen sich über einen Stream als Blob in einer so genannten Media Resource speichern. Fügt man mittels Add()-Methode der DataEntries-Collection eines DataFeeds einen neuen Eintrag hinzu, so lässt sich im entsprechenden Konstruktor ein Stream mit den Daten angeben:

DataEntry de = _photoFeed.DataEntries.Add(stream, "ResourceIdentifier");

Will man die so gespeicherten Daten aus dem DataEntry wieder auslesen, so ruft man auf dem Eintrag die Methode ReadMediaResource() auf und erhält damit einen Stream, der die Daten bereitstellt:

var stream = new MemoryStream();
de.ReadMediaResource(stream);

Media Resource auf einem DataEntry wurde in MeshPhotoShare verwendet, um die eigentlichen Fotodateien von der Festplatte im Mesh zu speichern und dann im Silverlight-UI anzeigen zu lassen. Eine Eigenschaft von Media Resources ist es dabei, dass sie nicht automatisch in den Speicher geladen werden, sondern erst explizit bei Aufruf der Methode ReadMediaResource(). Dies kann zur Performance einer Anwendung beitragen, da z.B. große Videos oder andere Binärdaten nur auf Anforderung geladen werden. Eine weitere wichtige Möglichkeit der Datenspeicherung auf einem DataEntry stellt UserData dar. Als UserData kann praktisch jede Instanz einer serialisierbaren Klasse gespeichert werden. Wie bei Media Resource ist es dabei nur möglich, genau ein Objekt in einem DataEntry abzulegen. Im Beispiel von MeshPhotoShare wurden die Metadaten eines Fotos aus der Klasse PhotoUserData in UserData gespeichert. Hierzu wird auf einem DataEntry die Methode SetUserData() aufgerufen:

PhotoUserData userdata = ...
de.Resource.SetUserData(userdata);
de.Update();

Über den anschließenden Aufruf der Update()-Methode werden die durchgeführten Änderungen im Mesh publiziert. Wichtig dabei ist, dass immer das komplette Datenobjekt in Mesh serialisiert wird, ein partielles Update nur der geänderten Properties ist nicht möglich. Wie das Schreiben ist auch das Lesen der Daten aus UserData über einen einfachen Aufruf möglich:

PhotoUserData userdata = de.Resource.GetUserData();

Neben UserData und Media Resource gibt es noch weitere Möglichkeiten Daten im Mesh zu speichern, auf die an dieser Stelle aber nicht eingegangen wird. Mehr Informationen gibt es unter [9]. Mit diesen Konzepten war es auf einfache Weise möglich, Daten aus dem Mesh bidirektional an das Silverlight-UI zu binden. Bei Programmstart werden zunächst alle im Mesh gespeicherten Fotos gelesen, in das programmeigene Datenmodell transformiert und angezeigt. Fügt der Benutzer ein neues Foto hinzu, so wird für dieses ein neuer DataEntry erstellt und mit dem entsprechenden Stream des Bildes im Mesh gespeichert. Ändert der Benutzer die Metadaten eines Bildes im UI, so wird das dabei gefeuerte PropertyChanged-Event abgefangen und die Benutzerdaten werden auf dem entsprechenden DataEntry im Mesh aktualisiert.

Teil 1   Teil 2   Teil 3   Teil 4   Teil 5   

Kommentare