boost.serialization et initialisation tardive
-
23-09-2019 - |
Question
i besoin de sérialisation arborescence. Je n'ai aucun problème avec ce type:
std::map<
std::string, // string(path name)
std::vector<std::string> // string array(file names in the path)
> tree;
mais pour la sérialisation l'arborescence du contenu i need autre type:
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;
Comment puis-je initialize l'objet de type "std :: pair" au moment de sa sérialisation? à savoir lire morceau de fichier / calculer CRC32 Rés.
up
La solution
Je remplacerais le std::string
dans le vecteur par une classe personnalisée, laissez-moi vous dire 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;
Et définir la fonction de sérialisation save
pour MyFileNames
en convertissant le std :: string à un
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
>
>
>
et serialize ce type. Cela vous permet d'évaluer la partie paresseuse que les données sont sérialisés. Pour la charge, vous pouvez ignorer les données paresseux, comme je suppose que ces données peuvent être calculées.
Autres conseils
Je ne comprends pas bien la question, mais #including "boost / sérialisation / utility.hpp" vous donne la mise en œuvre de sérialisation std :: paire.
Si vous voulez charger la zone de votre code plus tard, alors je pense que la meilleure façon serait de créer une classe de paire personnalisée:
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 );
}