boost::serialization
От: nen777w  
Дата: 09.06.11 08:03
Оценка:
Есть возможность передать дополнительный аргумент в функции 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;
};


По моему реализация сего не сильно сложной должна получится. Но вот найти такого в документации не могу.
Re: boost::serialization
От: Abyx Россия  
Дата: 09.06.11 08:10
Оценка: +1
Здравствуйте, nen777w, Вы писали:

N>Есть возможность передать дополнительный аргумент в функции save/load во время сериализации?


операторы <<, >>, & — бинарные и в них вы ничего не передадите
вам надо написать свой архив (или расширить существующий), и использовать архив как контейнер для ваших параметров

  template<typename Archive>
  void save(Archive & ar, const unsigned int version) const
  {
     Helper& hlp = ar.get_hlp();
     ...
  }
In Zen We Trust
Re[2]: boost::serialization
От: Mazay Россия  
Дата: 09.06.11 08:14
Оценка:
Здравствуйте, 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.
Главное гармония ...
Re[3]: boost::serialization
От: Abyx Россия  
Дата: 09.06.11 08:17
Оценка: 6 (1)
Здравствуйте, Mazay, Вы писали:

M>Добавлю, что сделать это несложно. Достаточно отнаследоваться от существующего архива из boost::serialization


при этом надо прочитать http://www.boost.org/doc/libs/1_46_1/libs/serialization/doc/derivation.html
In Zen We Trust
Re[2]: boost::serialization
От: nen777w  
Дата: 09.06.11 08:19
Оценка:
Здравствуйте, 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>



Я конечно же не имел в виду через операторы. По сути нужен просто хитрый макрос. который сделает правильный вызов правильной функции которой увы похоже нет в библиотеке.
за совет про архив спасибо. надо будет подумать.
Re[4]: boost::serialization
От: nen777w  
Дата: 09.06.11 23:01
Оценка:
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;
Re[5]: boost::serialization
От: Abyx Россия  
Дата: 09.06.11 23:19
Оценка:
Здравствуйте, nen777w, Вы писали:

[...]

ну чтож поделать, читайте документацию дальше
я буст.сериализацию никогда не использовал, уж очень там всё сложно, проще свой велосипед написать
In Zen We Trust
Re[6]: boost::serialization
От: nen777w  
Дата: 09.06.11 23:22
Оценка:
Здравствуйте, 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)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.