This section introduces wrapper functions to optimize the serialization process. These functions mark objects to allow Boost.Serialization to apply certain optimization techniques.
#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();
}
Example 64.14 uses Boost.Serialization without any wrapper function. The example creates and writes the value 22 serialization::archive 11 0 0 3 0 1 2
to the string. Using the wrapper function boost::serialization::make_array()
, the value written can be shortened to the following string: 22 serialization::archive 11 0 1 2
.
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();
}
boost::serialization::make_array()
expects the address and the length of an array. However, because it is known in advance, the length does not need to be serialized as part of the array.
boost::serialization::make_array()
can be used whenever classes such as std::array
or std::vector
contain an array that can be serialized directly. Additional member variables, which would normally also be serialized, are skipped (see Example 64.15).
Boost.Serialization also provides the wrapper boost::serialization::make_binary_object()
. Similar to boost::serialization::make_array()
, this function expects an address and a length. boost::serialization::make_binary_object()
is used solely for binary data that has no underlying structure, while boost::serialization::make_array()
is used for arrays.