Boost.Serialização e inicialização preguiçosa
-
23-09-2019 - |
Pergunta
Preciso serializar em serializar a árvore do diretório. Não tenho problemas com este tipo:
std::map<
std::string, // string(path name)
std::vector<std::string> // string array(file names in the path)
> tree;
Mas para a serialização a árvore do diretório com o conteúdo de que preciso de outro tipo:
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;
Como posso inicializar O objeto do tipo "std :: par" no momento de sua serialização? ou seja, leia o arquivo de arquivo/calcule o resumo do CRC32.
acima
Solução
Eu substituiria o std::string
No vetor por uma aula personalizada, deixe -me dizer 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;
E definir o save
Função de serialização para MyFileNames
convertendo o std :: string para um
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
>
>
>
e o serializar esse tipo. Isso permite avaliar a parte preguiçosa, apenas os dados são serializados. Para a carga, você pode ignorar os dados preguiçosos, pois suponho que esses dados possam ser calculados.
Outras dicas
Eu não entendo muito bem a pergunta, mas #including "boost/serialização/utilitário.hpp" fornece a implementação para serializar o par de std ::.
Se você deseja carregar a área do seu código mais tarde, acho que a melhor maneira seria criar uma classe de par personalizada:
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 );
}