2010-03-31 35 views
0

J'ai besoin de sérialiser l'arborescence de répertoires. je n'ai aucun problème avec ce type:boost.serialization et initialisation paresseuse

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 des répertoires avec le contenu i besoin d'autres types:

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 initialiser l'objet de type « std :: pair "au moment de sa sérialisation? , c'est-à-dire lire le fichier/calculer crc32 summ.

jusqu'à

Répondre

2

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 de sérialiser ce type. Cela vous permet d'évaluer la partie paresseuse uniquement les données sont sérialisées. Pour la charge, vous pouvez ignorer les données paresseuses, car je suppose que ces données peuvent être calculées.

2

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); 
} 
0

Je ne comprends pas non plus la question.

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

Si je mets un élément dans l'arbre et aller:

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

il sort:

22 sérialisation :: archives 7 0 0 1 0 0 0 3 0 foo 0 1 0 0 0 3 bar 0 0 1 0 0 0 3 baz 27

dont je Je suis sûr que vous pouvez désérialiser.

(testé avec boost 1,42)

Ah. Maintenant vous avez changé 'sérialiser' pour 'initialiser'. Il n'y a pas de hooks pour modifier vos données à la volée, vous devrez donc le faire juste avant et juste après.