Frage

Ich muss serialize Verzeichnisbaum. Ich habe keine Probleme mit dieser Art:

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

aber für die Serialisierung des Verzeichnisbaum mit dem Inhalt i andere Art benötigen:

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;

Wie kann ich initialize das Objekt vom Typ "std :: pair" in dem Moment seiner Serialisierung? das heißt Datei Stück / berechnen crc32 summ lesen.

bis

War es hilfreich?

Lösung

Ich würde die std::string in dem Vektor durch eine benutzerdefinierte Klasse ersetzen, lassen Sie uns sagen 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;

Und definiert die save Serialisierungsfunktion für MyFileNames durch die std :: Umwandlung String in einem

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
        >
     >
>

und die serialize diese Art. Dies können Sie den faulen Teil bewerten nur die Daten serialisiert wird. Für die Last könnte man die faulen Daten ignorieren, wie ich, dass diese Daten annehmen können berechnet werden.

Andere Tipps

ich nicht ganz verstehe die Frage, aber #including "boost / Serialisierung / utility.hpp" gibt Ihnen die Implementierung für Serialisierung std :: pair.

Wenn Sie den Bereich Ihres Codes zu ladende später, dann denke ich, der beste Weg, eine benutzerdefinierte Paar Klassen erstellen würde:

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 );
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top