Die Boost C++ Bibliotheken

Wrapper-Funktionen zur Optimierung

Während Sie Boost.Serialization soweit kennengelernt haben, dass Sie Objekte serialisieren können, werden Ihnen abschließend Wrapper-Funktionen vorgestellt, mit denen Sie die Serialisierung optimieren können. Indem Sie Wrapper-Funktionen verwenden, markieren Sie gewissermaßen Objekte, was Boost.Serialization ermöglicht, entsprechende Optimierungstechniken anzuwenden.

Beispiel 64.14. Serialisierung eines Arrays auf herkömmliche Weise
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/array.hpp>
#include <iostream>
#include <sstream>

using namespace boost::archive;

std::stringstream ss;

void save()
{
  text_oarchive oa{ss};
  boost::array<int, 3> a{{0, 1, 2}};
  oa << a;
}

void load()
{
  text_iarchive ia{ss};
  boost::array<int, 3> a;
  ia >> a;
  std::cout << a[0] << ", " << a[1] << ", " << a[2] << '\n';
}

int main()
{
  save();
  load();
}

Der Text-Stream, der im Beispiel 64.14 bei der Serialisierung erstellt wird, ist 22 serialization::archive 11 0 0 3 0 1 2. Mit Hilfe der im Beispiel 64.15 verwendeten Wrapper-Funktion boost::serialization::make_array() kann der Text-Stream auf 22 serialization::archive 11 0 1 2 verkürzt werden.

Beispiel 64.15. Serialisierung eines Arrays mit make_array()
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/array.hpp>
#include <array>
#include <iostream>
#include <sstream>

using namespace boost::archive;

std::stringstream ss;

void save()
{
  text_oarchive oa{ss};
  std::array<int, 3> a{{0, 1, 2}};
  oa << boost::serialization::make_array(a.data(), a.size());
}

void load()
{
  text_iarchive ia{ss};
  std::array<int, 3> a;
  ia >> boost::serialization::make_array(a.data(), a.size());
  std::cout << a[0] << ", " << a[1] << ", " << a[2] << '\n';
}

int main()
{
  save();
  load();
}

Der Funktion boost::serialization::make_array() muss die Adresse eines Arrays und dessen Länge übergeben werden. Weil die Länge im Voraus bekannt ist, muss sie nicht als Bestandteil des Objekts vom Typ boost::array serialisiert werden.

boost::serialization::make_array() bietet sich immer dann an, wenn eine Klasse wie std::array oder std::vector ein Array enthalten und das Array direkt serialisiert werden kann. Andere Eigenschaften, die womöglich zur Serialisierung der entsprechenden Klasse gespeichert werden müssten, werden nicht serialisiert.

Eine weitere Wrapper-Funktion, die Boost.Serialization anbietet, ist boost::serialization::make_binary_object(). Ihr muss ähnlich wie boost::serialization::make_array() eine Adresse und eine Länge übergeben werden. Der Unterschied zwischen den beiden Funktionen ist, dass boost::serialization::make_binary_object() ausschließlich für Binärdaten verwendet wird, denen keinerlei Struktur zugrunde liegt, während boost::serialization::make_array() für Arrays verwendet wird.