简体   繁体   中英

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

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

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM