2010-03-31 2 views
0

Мне нужно сериализовать дерево каталогов. у меня нет никаких проблем с этим типом:boost.serialization и ленивая инициализация

std::map< 
    std::string, // string(path name) 
    std::vector<std::string> // string array(file names in the path) 
> tree; 

но для сериализации дереву каталогов с содержимым я нужен другой тип:

std::map< 
    std::string, // string(path name) 
    std::vector< // files array 
     std::pair< 
     std::string, // file name 
     std::vector< // array of file pieces 
      std::pair< // <<<<<<<<<<<<<<<<<<<<<< for this i need lazy initialization 
       std::string, // piece buf 
       boost::uint32_t // crc32 summ on piece 
      > 
     > 
     > 
    > 
> tree; 

как я могу инициализировать объект типа «зЬе :: pair "в момент его сериализации? т. Е. Читать файл фрагмента/вычислять crc32 summ.

до

ответ

2

Я хотел бы заменить std::string в векторе с помощью пользовательского класса, позволь мне сказать, MyFileNames

class MyFileNames : std::string 
{ 
// add forward constructors as needed 

}; 

std::map< 
    std::string, // string(path name) 
    std::vector<MyFileNames> // string array(file names in the path) 
> tree; 

И определит функцию save сериализации для MyFileNames пути преобразования зОго :: строки в

std::pair< 
    std::string, // file name 
    std::vector< // array of file pieces 
     std::pair< // <<<<<<<<<<<<<<<<<<<<<< for this i need lazy initialization 
      std::string, // piece buf 
      boost::uint32_t // crc32 summ on piece 
     > 
    > 
> 

и сериализуем этот тип. Это позволяет оценивать ленивую часть только для сериализации данных. Для загрузки вы можете игнорировать ленивые данные, так как я полагаю, что эти данные могут быть рассчитаны.

2

Я не совсем понял вопрос, но #including «повысить/сериализации/utility.hpp» дает реализацию serialising зЬй :: пары.

Если вы хотите загрузить область кода позже, то я думаю, что лучше всего было бы создать пользовательский класс пары:

class custom_pair : std::pair< std::string, // piece buf 
       boost::uint32_t > // crc32 summ on piece 
{ 

}; 

//... 
     std::vector< // array of file pieces 
      custom_pair // <<<<<<<<<<<<<<<<<<<<<< for this i need lazy initialization 
     > 
//... 

template< class Archive > 
void serialize(Archive & ar, custom_pair & p, const unsigned int version) { 
    ar & boost::serialization::make_nvp("std::pair", std::pair<...>(p)); 
} 

template<class Archive> 
inline void load_construct_data(Archive & ar, custom_pair * p, const unsigned int file_version) { 
    std::string first; 
    boost::uint32_t second; 
    ar & boost::serialization::make_nvp("first", first_); 
    ar & boost::serialization::make_nvp("second", second_); 
    ::new(t)custom_pair; 
    //... 
} 

template<class Archive> 
inline void save_construct_data(Archive & ar, const custom_pair * p, const unsigned int file_version) { 
    ar & boost::serialization::make_nvp("first", t->first); 
    ar & boost::serialization::make_nvp("second", t->second); 
} 
0

Я не понимаю вопрос либо.

#include <boost/archive/text_oarchive.hpp> 
#include <boost/serialization/map.hpp> 
#include <boost/serialization/vector.hpp> 

Если я ставлю один элемент в дереве и идти:

boost::archive::text_iarchive ia(std::cout); 
oa << tree; 

выводит:

22 сериализации :: Архив 7 0 0 1 0 0 0 3 Foo 0 0 1 0 0 0 3 бар 0 0 1 0 0 0 3 baz 27

, который я «Конечно, вы можете десериализовать.

(проверено с бустером 1.42)

Ah. Теперь вы изменили 'serialize' на 'initialize'. Нет никаких перехватчиков для изменения ваших данных «на лету», поэтому вам придется делать это как раньше, так и сразу.

Смежные вопросы