|
Boost Users : |
Subject: [Boost-users] Boost serializing abstract base class
From: John King (usedforprinting123_at_[hidden])
Date: 2015-09-08 17:59:47
I'm having trouble serializing a few classes with boost serialization. I've
looked through different documentation and I've found it pretty confusing.
Some say that you have to include certain libraries in a certain order,
others say you have to use BOOST_SERIALIZATION_BASE_OBJECT_NVP, others
boost::serialization::base_object, etc. I've also seen some use
BOOST_CLASS_EXPORT() but I don't want to have to list every single possible
derived class...
The code:
*main.cpp:*
#include <iostream>
#include <memory>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <fstream>
#include "model.h"
#include "c1.h"
int main()
{
std::shared_ptr<C1> c1 = std::make_shared<C1>();
Model m(c1);
std::cout << "TYPE: " << m.which_type_in_use() << std::endl;
std::ofstream out_stream("test.bin", std::ios::out |
std::ios::binary | std::ios::trunc);
boost::archive::binary_oarchive oar(out_stream);
oar << (m);
Model m2;
std::ifstream in_stream("test.bin", std::ios::in |
std::ios::binary);
boost::archive::binary_iarchive iar(in_stream);
iar >> (m2);
std::cout << "TYPE: " << m2.which_type_in_use() << std::endl;
}
*p1.h:*
#ifndef P1_H_
#define P1_H_
#include <string>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
class P1
{
protected:
int size = 100;
std::string type;
public:
int get_size()
{
return size;
}
virtual std::string get_type() = 0;
friend class boost::serialization::access;
template<typename Archive>
void serialize(Archive &ar, const unsigned int version) {
ar & size;
ar & type;
}
};
#endif
*c1.h:*
#ifndef C1_H_
#define C1_H_
#include "p1.h"
#include <string>
#include <boost/serialization/serialization.hpp>
class C1 : public P1
{
public:
bool is_child = true;
C1()
{
int r = 10;
}
std::string get_type();
template<typename Archive>
void serialize(Archive &ar, const unsigned int version) {
ar & is_child;
ar & boost::serialization::base_object<P1>(*this);
}
};
#endif
*c1.cpp:*
#include "c1.h"
std::string C1 :: get_type()
{
return "c1";
}
*model.h:*
#ifndef MODEL_H_
#define MODEL_H_
#include <memory>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include "p1.h"
class Model
{
public:
bool is_model = true;
//int *nums;
std::shared_ptr<P1> p;
Model(std::shared_ptr<P1> p1);
Model() = default;
std::string which_type_in_use();
template<typename Archive> void serialize(Archive &ar, const
unsigned int version);
};
#endif
*model.cpp:*
#include "model.h"
Model :: Model(std::shared_ptr<P1> p1) : p(p1)
{
//nums = (int*)malloc(10*sizeof(int));
//nums[5] = 123;
}
std::string Model :: which_type_in_use()
{
return p->get_type();
}
template<typename Archive>
void Model :: serialize(Archive &ar, const unsigned int version) {
ar & is_model;
ar & p;
}
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net