Boost.Serialization can also serialize pointers and references. Because a pointer stores the address of an object, serializing the address does not make much sense. When serializing pointers and references, the referenced object is serialized.
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <iostream>
#include <sstream>
std::stringstream ss;
class animal
{
public:
animal() = default;
animal(int legs) : legs_{legs} {}
int legs() const { return legs_; }
private:
friend class boost::serialization::access;
template <typename Archive>
void serialize(Archive &ar, const unsigned int version) { ar & legs_; }
int legs_;
};
void save()
{
boost::archive::text_oarchive oa{ss};
animal *a = new animal{4};
oa << a;
std::cout << std::hex << a << '\n';
delete a;
}
void load()
{
boost::archive::text_iarchive ia{ss};
animal *a;
ia >> a;
std::cout << std::hex << a << '\n';
std::cout << std::dec << a->legs() << '\n';
delete a;
}
int main()
{
save();
load();
}
Example 64.8 creates a new object of type animal
with new
and assigns it to the pointer a. The pointer – not *a
– is then serialized. Boost.Serialization automatically serializes the object referenced by a and not the address of the object.
If the archive is restored, a will not necessarily contain the same address. A new object is created and its address is assigned to a instead. Boost.Serialization only guarantees that the object is the same as the one serialized, not that its address is the same.
Because smart pointers are used in connection with dynamically allocated memory, Boost.Serialization provides also support for them.
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/scoped_ptr.hpp>
#include <boost/scoped_ptr.hpp>
#include <iostream>
#include <sstream>
using namespace boost::archive;
std::stringstream ss;
class animal
{
public:
animal() = default;
animal(int legs) : legs_{legs} {}
int legs() const { return legs_; }
private:
friend class boost::serialization::access;
template <typename Archive>
void serialize(Archive &ar, const unsigned int version) { ar & legs_; }
int legs_;
};
void save()
{
text_oarchive oa{ss};
boost::scoped_ptr<animal> a{new animal{4}};
oa << a;
}
void load()
{
text_iarchive ia{ss};
boost::scoped_ptr<animal> a;
ia >> a;
std::cout << a->legs() << '\n';
}
int main()
{
save();
load();
}
Example 64.9 uses the smart pointer boost::scoped_ptr
to manage a dynamically allocated object of type animal
. Include the header file boost/serialization/scoped_ptr.hpp
to serialize such a pointer. To serialize a smart pointer of type boost::shared_ptr
, use the header file boost/serialization/shared_ptr.hpp
.
Please note that Boost.Serialization hasn’t been updated for C++11, yet. Smart pointers from the C++11 standard library like std::shared_ptr
and std::unique_ptr
are not currently supported by Boost.Serialization.
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <iostream>
#include <sstream>
using namespace boost::archive;
std::stringstream ss;
class animal
{
public:
animal() = default;
animal(int legs) : legs_{legs} {}
int legs() const { return legs_; }
private:
friend class boost::serialization::access;
template <typename Archive>
void serialize(Archive &ar, const unsigned int version) { ar & legs_; }
int legs_;
};
void save()
{
text_oarchive oa{ss};
animal a{4};
animal &r = a;
oa << r;
}
void load()
{
text_iarchive ia{ss};
animal a;
animal &r = a;
ia >> r;
std::cout << r.legs() << '\n';
}
int main()
{
save();
load();
}
Boost.Serialization can also serialize references without any issues (see Example 64.10). Just as with pointers, the referenced object is serialized automatically.