0

ディレクトリツリーをシリアル化する必要があります。私はこのタイプに問題はありません:

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

しかし、シリアル化のために、私が他のタイプを必要とするコンテンツを含むディレクトリツリー:

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;

シリアル化の瞬間に「std::pair」タイプのオブジェクトを初期化するにはどうすればよいですか?つまり、ファイルの一部を読み取り、crc32の合計を計算します。

4

2 に答える 2

2

std::stringベクトル内のをカスタムクラスに置き換えます。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;

そして、std :: stringをに変換することにより、のsaveシリアル化関数を定義します。MyFileNames

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

このタイプをシリアル化します。これにより、データのみがシリアル化される遅延部分を評価できます。負荷については、このデータを計算できると思うので、遅延データを無視できます。

于 2010-04-26T11:57:30.390 に答える
2

質問はよくわかりませんが、#include "boost/serialization/utility.hpp" を使用すると、std::pair をシリアライズするための実装が得られます。

後でコードの領域をロードする場合は、カスタム ペア クラスを作成するのが最善の方法だと思います。

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 );
}
于 2010-03-31T11:54:06.210 に答える