Schreiben und lesen von Binärdaten

Importieren Sie bitte für das folgende Beispiel die Client API Testdaten. Wir erstellen nun ein neues Datenobjekt mit Binärdaten im onion.net Information Server.

using System;
using System.IO;
using System.Xml.Linq;
using Onion.Client;

class Program
{
  static void Main(string[] args)
  {
    using (var session = new OnionSession("ipc://onion.net/onion/server", "admin", "admin"))
    {
      IDataObject contacts = session.Repository.Lookup("Client API Testdata", "1. Contacts");

      // first we make the picture available on the server
      ITemporaryBinaryObject picture = session.Repository.CreateBinary("image/jpeg");

      using (var target = picture.CreateStream())
      using (var source = File.OpenRead(@"C:\Testdaten\Erika.jpg"))
      {
        CopyStream(source, target);
      }

      XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";

      // by the use of the temporary binary reference, it gets persisted along with the data object
      var el = new XElement("person",
        new XAttribute(XNamespace.Xmlns + "xsi", xsi),
        new XAttribute(xsi + "schemaLocation", "http://onion.net/examples/client-api/contacts/person"),
        new XAttribute("gender", "female"),
        new XElement("picture", picture.ReferenceIdentifier)
      );

      IDataObject newContact = contacts.Children.Create("Erika Mustermann", el.ToString());

      Console.WriteLine(String.Format("New data object {0} created on {1}.",
        newContact.Id, newContact.DateCreated));
    }
  }

  private static void CopyStream(Stream source, Stream target)
  {
    int bytesRead;
    var buffer = new byte[32768];

    while ( (bytesRead = source.Read(buffer, 0, buffer.Length)) > 0)
    {
      target.Write(buffer, 0, bytesRead);
    }
  }
}

In onion.net gibt es kein physikalisches Dateisystem und somit keine Dateireferenzen für Binärdaten. Stattdessen ermöglicht onion.net Binärdaten in Datenobjekte einzubetten. Die Anzahl der Binärobjekte in einem Datenobjekt ist dabei wie in XML üblich nicht beschränkt. Sie werden jedoch aus Effizienzgründen nicht als Base64-kodierter String innerhalb des Xml-Dokuments gespeichert, sondern in einem verwalteten Binärdatenspeicher vorgehalten.

In dem oberen Beispiel wird ein flüchtiges Binärdatenobjekt (ITemporaryBinaryObject) erzeugt, mit Daten aus einer Datei befüllt und anschließend als Teil des neuen Datenobjekts übergeben. onion.net konvertiert die flüchtigen Binärdatenobjekte automatisch in persistente Binärdaten. Das folgende Beispiel zeigt, wie die Binärdaten wiederum ausgelesen werden können:

using System;
using System.Xml.Linq;
using Onion.Client;

class Program
{
  static void Main(string[] args)
  {
    using (var session = new OnionSession("ipc://onion.net/onion/server", "admin", "admin"))
    {
      IDataObject dataObject = session.Repository.Lookup("Client API Testdata", "1. Contacts", "Erika Mustermann");

      var doc = XDocument.Load(dataObject.CreateXmlReader());

      IBinaryObject picture = dataObject.GetBinary(doc.Element("person").Element("picture").Value);
     
      using (Stream source = picture.CreateStream())
      {
        Console.WriteLine(String.Format("Binary {0} with mimetype {1} has a length of {2} bytes.",
          picture.ReferenceIdentifier, picture.MimeType, source.Length));
      }
    }
  }
}

Über die Lookup Methode wird das Datenobjekt "Erika Mustermann" adressiert. Die Binärdatenreferenz wird aus dem Xml-Dokument extrahiert und über die Methode IDataObject.GetBinary erfolgt letztlich der Zugriff auf die Binärdaten. Das Beispiel sollte zu einem Ergebnis führen, welches diesem ähnelt: 

Binary onion://data/binaries/3 with mimetype image/jpeg has a length of 770042 bytes.