Reputation:
When i try to serilize data where Sphere is subclass of geometry the program crashes with unhandled exception.
Exception thrown at 0x000007FEFCA0B87D in Serialization.exe: Microsoft C++ exception: boost::archive::archive_exception at memory location 0x000000000022F730
This happens on this line "ar & g ;"
include "pch.h"
#include <iostream>
#include<fstream>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include "Geometry.h"
#include "Sphere.h"
#include <boost/serialization/export.hpp>
int main()
{
const char* fileName = "saved.txt";
Sphere Sph;
Geometry* g = &Sph;
// save data
{
// Create an output archive
std::ofstream ofs(fileName);
boost::archive::text_oarchive ar(ofs);
ar & g ; // This lines throws exception.
}
Geometry* c_Restored;
//load data
{
// create an input stream
std::ifstream ifs(fileName);
boost::archive::text_iarchive ar(ifs);
ar & c_Restored;
}
c_Restored->PrintGeom();
do
{
std::cout << '\n' << "Press a key to continue...";
} while (std::cin.get() != '\n');
}
/////////////////////////////////////////////////////////////////////
#include "Geometry.h"
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/export.hpp>
class Sphere : public Geometry
{
private:
std::string stdstrSphere;
public:
Sphere() : stdstrSphere( "DefaultSphere"){}
Sphere( std::string str) : stdstrSphere(str) {}
void PrintGeom()
{
std::cout << "Sphere Virtual Function" << std::endl;
}
private:
typedef Geometry _Super;
friend class boost::serialization::access;
template <typename Archive>
void save(Archive& ar, const unsigned version) const {
boost::serialization::base_object<_Super>(*this);
ar & stdstrSphere;
}
template <typename Archive>
void load(Archive& ar, const unsigned version) {
boost::serialization::base_object<_Super>(*this);
ar & stdstrSphere;
}
BOOST_SERIALIZATION_SPLIT_MEMBER()
};
///////////////////////////////////////////////////////////////////////////// #pragma once
#include <string>
#include <boost/serialization/split_member.hpp>
#include <boost/serialization/base_object.hpp>
class Geometry
{
private:
std::string stdstringGeom;
public:
virtual void PrintGeom()
{
std::cout << "geometry virtual function";
}
private:
friend class boost::serialization::access;
template <typename Archive>
void save(Archive& ar, const unsigned version) const {
ar & stdstringGeom;
}
template <typename Archive>
void load(Archive& ar, const unsigned version) {
ar & stdstringGeom;
}
BOOST_SERIALIZATION_SPLIT_MEMBER()
};
Upvotes: 1
Views: 150
Reputation: 12898
When I compile and run the code shown the exception text is...
unregistered class - derived class not registered or exported
So the underlying problem is that you need to register your derived class(es) as outlined here. Try adding the following just before main
...
BOOST_CLASS_EXPORT_GUID(Sphere, "Sphere")
Upvotes: 1