序列化 压缩的问题与Boost库

Issue with serialization + compression with the boost library

本文关键字:Boost 问题 压缩 序列化      更新时间:2023-10-16

我在将对象压缩到字符串中,然后将数据序列化以使用Boost C 库将其序列化。这是从我在此处问的一个问题中提出的,这成功解决了从OpENCV库中序列化Iplimage struct的问题。

我的序列化代码如下:

// Now save the frame to a compressed string
boost::shared_ptr<PSMoveDataFrame> frameObj = frame->getCurrentRetainedFrame();
std::ostringstream oss;
std::string compressedString;
{
    boost::iostreams::filtering_ostream filter;
    filter.push(boost::iostreams::gzip_compressor());
    filter.push(oss);
    boost::archive::text_oarchive archive(filter);
    archive & frameObj;
} // This will automagically flush when it goes out of scope apparently
// Now save that string to a file
compressedString = oss.str();
{
    std::ofstream file("<local/file/path>/archive.bin");
    file << compressedString;
}
//    // Save the uncompressed frame
//    boost::shared_ptr<PSMoveDataFrame> frameObj = frame->getCurrentRetainedFrame();
//    std::ofstream file("<local/file/path>/archive.bin");
//    boost::archive::text_oarchive archive(file);
//    archive & frameObj;

和我的避难代码:

// Simply load the compressed string from the file
boost::shared_ptr<PSMoveDataFrame> frame;
std::string compressedString;
{
    std::ifstream file("<local/file/path>/archive.bin");
    std::string compressedString;
    file >> compressedString;
}
// Now decompress the string into the frame object
std::istringstream iss(compressedString);
boost::iostreams::filtering_istream filter;
filter.push(boost::iostreams::gzip_decompressor());
filter.push(iss);
boost::archive::text_iarchive archive(filter);
archive & frame;
//    // Load the uncompressed frame
//    boost::shared_ptr<PSMoveDataFrame> frame;
//    std::ifstream file("<local/file/path>/archive.bin");
//    boost::archive::text_iarchive archive(file);
//    archive & frame;

请注意,两个未压缩版本(注释)都可以正常工作。我遇到的错误来自boost :: archive ::关于输入流错误的Archive_exception。

  • " local/file/path"是我机器上的路径。

我天真地将压缩文件分别加载到字符串中。当然,ifstream不知道压缩字符串确实已被压缩。

以下代码解决了问题:

// Simply load the compressed string from the file
boost::shared_ptr<PSMoveDataFrame> frame;
// Now decompress the string into the frame object
std::ifstream file("<local/file/path>/archive.bin");
boost::iostreams::filtering_stream<boost::iostreams::input> filter;
filter.push(boost::iostreams::gzip_decompressor());
filter.push(file);
boost::archive::binary_iarchive archive(filter);
archive & frame;