Mam sobie klasę:
#ifndef FILTERCONTAINER_H
#define FILTERCONTAINER_H
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/archive_exception.hpp>
#include <boost/serialization/map.hpp>
#include <map>
#include "filter.h"
#include "system_dependencies.h"
class FilterContainer
{
public:
FilterContainer();
virtual ~FilterContainer();
unsigned installFromPath(const char *fileName) ;
private:
friend class boost::serialization::access;
typedef std::string FilterName ;
std::map<FilterName, std::string> fileNames ;
std::map<FilterName, Filter> filters ;
template<class Archive>
void serialize(Archive & ar, const unsigned int) ;
void copyFilterFile(const char *fileName) ;
void loadFilter(const char *fileName) ;
};
template<class Archive>
inline void FilterContainer::serialize(Archive & ar, const unsigned int)
{
REPORTER_F_THR(rep) ;
ar & boost::serialization::make_nvp("file names", fileNames);
}
#endif // FILTERCONTAINER_H
definicji reszty funkcji nie potrzeba
Obiekt filters tej klasy wczytuję w ten sposób:
void GTKThread::loadFilters()
{
REPORTER_F_THR(rep) ;
std::ifstream input("filters/filters.xml") ;
REPORT_VAR_THR(input.is_open()) ;
try
{
boost::archive::xml_iarchive ia(input);
ia>>BOOST_SERIALIZATION_NVP(filters);
}
catch(boost::archive::archive_exception &exc)
{
REPORT_VAR_THR(exc.what()) ;
}
if(input.is_open())
{
input.close() ;
}
}
A zapisuję przy końcu programu w ten sposób:
void GTKThread::saveFilters()
{
REPORTER_F_THR(rep) ;
system("mkdir filters") ; //na wypadek, gdyby nie było folderu
std::ofstream output("filters/filters.xml") ;
REPORT_VAR_THR(output.is_open()) ;
try
{
boost::archive::xml_oarchive oa(output);
oa<<BOOST_SERIALIZATION_NVP(filters);
}
catch(boost::archive::archive_exception &exc)
{
REPORT_VAR_THR(exc.what()) ;
}
if(output.is_open())
{
output.close() ;
}
}
No i za każdym razem przy zapisywaniu wyłapuję wyjątek exc.what() == uninitialized exception
Oczywiście z tego względu przy wczytywaniu wyłapuję wyjątek exc.what() == stream error
Wyciąg z loga:
| |--FUNCTION saveFilters(), line 113 in /d/studia/inzynierka/programy/EKGFilter/EKGFilter/EKGFilter/gtk_thread.cpp, by thread [3065542352] BEGIN
| | | VALUE of output.is_open() == 1 line 120 in saveFilters(), /d/studia/inzynierka/programy/EKGFilter/EKGFilter/EKGFilter/gtk_thread.cpp, by thread [3065542352]
| | |--FUNCTION serialize(), line 39 in /d/studia/inzynierka/programy/EKGFilter/EKGFilter/EKGFilter/filter_container.h, by thread [3065542352] BEGIN
| | |--FUNCTION serialize(), line 39 in /d/studia/inzynierka/programy/EKGFilter/EKGFilter/EKGFilter/filter_container.h, by thread [3065542352] END
| | | VALUE of exc.what() == uninitialized exception line 129 in saveFilters(), /d/studia/inzynierka/programy/EKGFilter/EKGFilter/EKGFilter/gtk_thread.cpp, by thread [3065542352]
| |--FUNCTION saveFilters(), line 113 in /d/studia/inzynierka/programy/EKGFilter/EKGFilter/EKGFilter/gtk_thread.cpp, by thread [3065542352] END
plik filters/filters.xml wygląda tak po zamknięciu programu:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="5">
<filters class_id="0" tracking_level="0" version="0"</boost_serialization>
Co jest źle? Według różnych tutoriali tak właśnie ma wyglądać serializacja obiektów z mapą.