Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to boost::serialize an std/boost::optional?

How can I serialize a class (with boost::serialization) that contains a boost::optional?

I.e. the following code will give an error when instantiated.

error C2039: 'serialize' : is not a member of 'boost::optional' C:\boost\boost_1_55_0\boost\serialization\access.hpp 118

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

class MyClass {
private:
    friend class boost::serialization::access;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & my_member;
    }

    boost::optional<int> my_member;
};

int main() {
    std::ofstream ofs("filename.txt");
    const MyClass g;
    boost::archive::text_oarchive oa(ofs);
    oa << g;
    return 0;
}

I understand there's probably a deeper question involved (what should you write to the file when the value is not present?), but there must be some standard solution for it. I am looking for the most simple way to solve this.

like image 269
Ela782 Avatar asked Sep 26 '14 14:09

Ela782


People also ask

What is Boost serialization?

The library Boost. Serialization makes it possible to convert objects in a C++ program to a sequence of bytes that can be saved and loaded to restore the objects.

What is Boost optional?

Boost C++ Libraries Class template optional is a wrapper for representing 'optional' (or 'nullable') objects who may not (yet) contain a valid value. Optional objects offer full value semantics; they are good for passing by value and usage inside STL containers. This is a header-only library.


1 Answers

For boost::optional you just need to add #include <boost/serialization/optional.hpp>

It implements a non-member serialize function that will allow you to serialize boost::optional without worrying about the details.

Under the hood it first saves/loads the boolean value of t.is_initialized() and depending on its value decides if to save/load the rest.

You can see the source code here: http://www.boost.org/doc/libs/1_56_0/boost/serialization/optional.hpp

like image 82
odedsh Avatar answered Oct 07 '22 05:10

odedsh