Boost serializacja - problem z mapą w klasie

0

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

0

Dobra, podstawowy problem rozwiązany - należało dać mapie alias niezawierający spacji - file_names. Mimo to, że już nie rzuca wyjątków, xml i tak się nie zmienia - choć mapa nie jest pusta w momencie zamykania programu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1