Boost.Serialization und faul Initialisierung
-
23-09-2019 - |
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
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 );
}