я хотел бы сериализировать класс с атрибутом как список указателей на универсальном классе
Это - родительский класс, из которого происходит универсальный класс:
class Base{
public :
friend class boost::serialization::access;
virtual ~Base(){}
template
void serialize(Archive & ar, const unsigned int version)
{
}
virtual string Getid() = 0 ;
};
Универсальный класс:
template
class GenericBase : public Base
{
public:
friend class boost::serialization::access;
GenericBase(string id){}
~GenericBase(){}
string id;
vector data
template
void serialize(Archive & ar, const unsigned int version)
{
ar & boost::serialization::base_object (*this);
ar & BOOST_SERIALIZATION_NVP( id);
ar & BOOST_SERIALIZATION_NVP( data);
}
string Getid() { return id; }
};
Класс я хочу сериализировать
class Use
{
public:
friend class boost::serialization::access;
int Id;
map BaseDatas;
Use();
~Use();
};
Так, после чтения документа сериализации повышения (http://www.boost.org/doc/libs/1_43_0/libs/serialization/doc/serialization.html#derivedpointers) я попробовал это в коде сериализации:
main(){
Use u = Use();
std::ofstream ofs(filename, ios::binary);
// save data to archive
boost::archive::binary_oarchive oa(ofs);
oa.template register_type >();
oa.template register_type >();
oa.template register_type >();
oa<
Я получил сообщение,
ошибка: 'шаблон' (как disambiguator) только позволяется в шаблонах
, таким образом, я заменил
oa.template register_type> ();
OA register_type ();
это работало, и я смог сохранить в тексте и в двоичном файле (я проверил данные),
для загрузки теперь, я просто использовал эти строки:
main(){
Use u;
std::ifstream ifs(filename, ios::binary);
// load data
ia.register_type >();
boost::archive::binary_iarchive ia(ifs);
ia>>u;
}
это бросило меня ошибка:
ошибка: никакая функция соответствия для вызова к 'GenericBase:: GenericBase ()'
кто-то сказал мне, что я должен был переопределить 2 метода, сохраняют и загружаются как в этом демонстрационном http://www.boost.org/doc/libs/1_43_0/libs/serialization/doc/serialization.html#constructors
namespace boost { namespace serialization {
template
inline void save_construct_data(
Archive & ar, const my_class * t, const unsigned int file_version)
{
// save data required to construct instance
ar << t->m_attribute;
}
template
inline void load_construct_data(
Archive & ar, my_class * t, const unsigned int file_version)
{
// retrieve data from archive required to construct new instance
int attribute;
ar >> attribute;
// invoke inplace constructor to initialize instance of my_class
::new(t)my_class(attribute);
}
}} // namespace ...
но где я должен определить их? В объявлении класса Использования? И как я имею дело с участником
map BaseDatas;
?
спасибо за Вашу справку ;)