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

Était-ce utile?

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 );
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top