Search code examples
c++boostboost-serialization

Construct object from boost serialization archive


Is it possible to construct objects from directly from the archive?

Something like this...

// Non-working pseudo code
struct Foo {
    BOOST_SERIALIZATION_SPLIT_MEMBER();
    std::vector<int> data;

    Foo() {
        // populate "data" by doing calculation
        data.push_back(1); data.push_back(2);
    }

    template<class Archive>
    Foo( Archive & ar ) {
        // populate "data" by rading the archive
    }

    template<class Archive>
    void save(Archive & ar, const unsigned int version) const {
        // Normal serialization of data
        ar << data;
    }
};

int main(int argc, const char *argv[])
{
    // deserialize
    boost::archive::text_iarchive oar(std::cin);
    Foo foo(oar);

    return 0;
}

Solution

  • You can use a deserializing constructor:

    #include <boost/archive/text_oarchive.hpp>
    #include <boost/archive/text_iarchive.hpp>
    
    #include <fstream>
    
    class Point
    {
    public:
        Point() = default;
        Point(boost::archive::text_iarchive& archive)
        {
            archive >> *this;
        }
    
        float x = 1.;
        float y = 2.;
    
    private:
        friend class boost::serialization::access;
    
        template<class TArchive>
        void serialize(TArchive & archive, const unsigned int version)
        {
            archive & x;
            archive & y;
        }
    };
    
    
    int main()
    {
        Point p;
        p.x = 5;
        p.y = 6;
    
        std::ofstream outputStream("test.archive");
        boost::archive::text_oarchive outputArchive(outputStream);
        outputArchive << p;
        outputStream.close();
    
        std::ifstream inputStream("test.archive");
        boost::archive::text_iarchive inputArchive(inputStream);
    
        Point pointRead(inputArchive);
    
        std::cout << pointRead.x << " " << pointRead.y << std::endl;
    
        return 0;
    }