Есть возможность передать дополнительный аргумент в функции save/load во время сериализации?
Смотрел доки так и не смог найти.
| "Т.е. Я хочу например вот так:" |
| class Helper {};
class B
{
friend class boost::serialization::access;
BOOST_SERIALIZATION_SPLIT_MEMBER();
template<typename Archive>
void save(Archive & ar, Helper& hlp, const unsigned int version) const
{
}
....
}
class A
{
friend class boost::serialization::access;
BOOST_SERIALIZATION_SPLIT_MEMBER();
template<typename Archive>
void save(Archive & ar, const unsigned int version) const
{
ar << B_object //И вот тут как то передать ещё m_hlp
}
B B_object;
Helper m_hlp;
};
|
| |
По моему реализация сего не сильно сложной должна получится. Но вот найти такого в документации не могу.
Здравствуйте, nen777w, Вы писали:
N>Есть возможность передать дополнительный аргумент в функции save/load во время сериализации?
операторы <<, >>, & — бинарные и в них вы ничего не передадите
вам надо написать свой архив (или расширить существующий), и использовать архив как контейнер для ваших параметров
template<typename Archive>
void save(Archive & ar, const unsigned int version) const
{
Helper& hlp = ar.get_hlp();
...
}
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, nen777w, Вы писали:
N>>Есть возможность передать дополнительный аргумент в функции save/load во время сериализации?
A>операторы <<, >>, & — бинарные и в них вы ничего не передадите
A>вам надо написать свой архив (или расширить существующий), и использовать архив как контейнер для ваших параметров
A>A> template<typename Archive>
A> void save(Archive & ar, const unsigned int version) const
A> {
A> Helper& hlp = ar.get_hlp();
A> ...
A> }
A>
+1
Добавлю, что сделать это несложно. Достаточно отнаследоваться от существующего архива из boost::serialization или внимательно покурить соответствующий концепт из документации и сделать PImpl.
Здравствуйте, Mazay, Вы писали:
M>Добавлю, что сделать это несложно. Достаточно отнаследоваться от существующего архива из boost::serialization
при этом надо прочитать
http://www.boost.org/doc/libs/1_46_1/libs/serialization/doc/derivation.html
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, nen777w, Вы писали:
N>>Есть возможность передать дополнительный аргумент в функции save/load во время сериализации?
A>операторы <<, >>, & — бинарные и в них вы ничего не передадите
A>вам надо написать свой архив (или расширить существующий), и использовать архив как контейнер для ваших параметров
A>A> template<typename Archive>
A> void save(Archive & ar, const unsigned int version) const
A> {
A> Helper& hlp = ar.get_hlp();
A> ...
A> }
A>
Я конечно же не имел в виду через операторы. По сути нужен просто хитрый макрос. который сделает правильный вызов правильной функции которой увы похоже нет в библиотеке.
за совет про архив спасибо. надо будет подумать.
M>>Добавлю, что сделать это несложно. Достаточно отнаследоваться от существующего архива из boost::serialization
A>при этом надо прочитать http://www.boost.org/doc/libs/1_46_1/libs/serialization/doc/derivation.html
Почитал.
Быстренько написал вот такой бинарный архив для загрузки с хелпером (практически один в один с binary_iarchive)
| "Code" |
| //h
//std
#include <istream>
//boost
#include "boost/archive/binary_iarchive.hpp"
namespace TEST
{
class pg_binnary_iarchive :
public boost::archive::binary_iarchive_impl<
TEST::pg_binnary_iarchive
, std::istream::char_type
, std::istream::traits_type
>
{
public:
pg_binnary_iarchive(std::istream & is, unsigned int flags = 0)
: binary_iarchive_impl<
pg_binnary_iarchive, std::istream::char_type, std::istream::traits_type
>(is, flags)
{}
pg_binnary_iarchive(std::streambuf & bsb, unsigned int flags = 0)
: binary_iarchive_impl<
pg_binnary_iarchive, std::istream::char_type, std::istream::traits_type
>(bsb, flags)
{}
void set_load_helper( ptr_load_helper_impl ptr ) { m_load_helper = ptr; }
void reset_load_helper() { m_load_helper.reset(); }
ptr_load_helper_impl get_load_helper_impl() { return m_load_helper; }
ptr_load_helper_impl get_load_helper_impl() const { return m_load_helper; }
private:
ptr_load_helper_impl m_load_helper;
};
}
//cpp
#include <istream>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/detail/archive_serializer_map.hpp>
#include <boost/archive/impl/archive_serializer_map.ipp>
#include <boost/archive/impl/basic_binary_iprimitive.ipp>
#include <boost/archive/impl/basic_binary_iarchive.ipp>
namespace boost { namespace archive {
// explicitly instantiate for this type of stream
template class detail::archive_serializer_map<TEST::pg_binnary_iarchive>;
template class basic_binary_iprimitive<
TEST::pg_binnary_iarchive,
std::istream::char_type,
std::istream::traits_type
>;
template class basic_binary_iarchive<TEST::pg_binnary_iarchive> ;
template class binary_iarchive_impl<
TEST::pg_binnary_iarchive,
std::istream::char_type,
std::istream::traits_type
>;
}}
|
| |
Данные сохранаю обычным binary_oarchive а вот загружаю при помощи своего pg_binnary_iarchive.
Почему то неправильно десериализуется вектора.
| "Code" |
| #include "boost/serialization/vector.hpp"
//сохранение
boost::archive::binary_oarchive oa( file_stream );
std::vector<int> v(10, 1);
int test = 11;
oa << v;
oa << test;
....
//загрузка
TEST::pg_binnary_iarchive ia( file_stream );
std::vector<int> v;
int test;
ia >> v; //вот тут элементов будет считано 10-ть штук но вот 10-й будет иметь значение 11 :xz:
ia >> test;
|
| |
Здравствуйте, nen777w, Вы писали:
[...]
ну чтож поделать, читайте документацию дальше
я буст.сериализацию никогда не использовал, уж очень там всё сложно, проще свой велосипед написать
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, nen777w, Вы писали:
A>[...]
A>ну чтож поделать, читайте документацию дальше
A>я буст.сериализацию никогда не использовал, уж очень там всё сложно, проще свой велосипед написать
Только что разобрался. Недосмотрел в исходниках boosta вот эти два макроса:
// required by export
BOOST_SERIALIZATION_REGISTER_ARCHIVE(TEST::pg_binnary_iarchive)
BOOST_SERIALIZATION_USE_ARRAY_OPTIMIZATION(TEST::pg_binnary_iarchive)