我需要序列化目录树。 我对这种类型没有问题:
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 summ。
达
答案 0 :(得分:2)
我不太明白这个问题,但是#including“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 );
}
答案 1 :(得分: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
>
>
>
并序列化此类型。 这使您可以仅评估数据序列化的惰性部分。对于负载,您可以忽略惰性数据,因为我认为可以计算此数据。