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.
#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.
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.