【问题标题】:Boost binary serialization with a map and doubles crashes on serialize in使用映射提升二进制序列化并在序列化时加倍崩溃
【发布时间】:2011-09-06 10:08:57
【问题描述】:

这是代表我的问题的示例。除非 finalTime 大于 25,否则该映射将完全正常地序列化。通过 boost 单元测试,我得到了 std::exception 输入流错误。此外,此代码使用 polymorphic_text_archives 也能正常工作。读取地图时发生错误。

#include <fstream>
#include <iostream>
#define BOOST_ALL_DYN_LINK
#define BOOST_PARAMETER_MAX_ARITY 8
#include <boost/serialization/export.hpp>
#include <boost/archive/polymorphic_iarchive.hpp>
#include <boost/archive/polymorphic_oarchive.hpp>
#include <boost/archive/polymorphic_binary_iarchive.hpp>
#include <boost/archive/polymorphic_binary_oarchive.hpp>
#include <boost/static_assert.hpp>
#include <boost/serialization/map.hpp>

using namespace boost;

class DoubleTest
{
public:
    DoubleTest(double d)
    {
        this->Double = d;
    }

    DoubleTest()
    {
        this->Double = 0;
    }

    void serialize(boost::archive::polymorphic_iarchive & ar, const unsigned int)
    {
        ar & this->Double;
    }

    void serialize(boost::archive::polymorphic_oarchive & ar, const unsigned int)
    {
        ar & this->Double;
    }

    double Double;
};

int main(int argc, char** argv)
{
    const std::string fileName = "test.out";
    std::map<float, DoubleTest*> mymap;

    const int initialValue = 0;
    const int initialTime = 0;

    // A "finalTime" of 25 works. "26" does not.
    const int finalTime = 26;
    int value = 10;

    // Put values into the map.
    for(int time = initialTime; time < finalTime; time += 1)
    {
        value++;
        mymap[time] = new DoubleTest(value);
    }

    // Write a binary archive out.
    std::ofstream ofs(fileName.c_str());
    boost::archive::polymorphic_binary_oarchive oa(ofs);
    oa << mymap;
    ofs.flush();
    ofs.close();

    // Create a new map to read the binary archive into.
    std::map<float, DoubleTest*> mymap2;

    // Read in the new binary archive.
    std::ifstream ifs(fileName.c_str());
    boost::archive::polymorphic_binary_iarchive ia(ifs);
    ia >> mymap2;
    ifs.close();

    // Loop through the values to make sure they are correct.
    std::map<float, DoubleTest*>::iterator it; 
    for(it = mymap2.begin(); it != mymap2.end(); ++it)
    {
        std::cout << "Key: " << it->first << " ";
        std::cout << "Value: " << it->second->Double << '\n';
    }

    int pause;
    std::cin >> pause;
}

【问题讨论】:

    标签: c++ serialization boost map boost-serialization


    【解决方案1】:

    您需要序列化为二进制文件流。将 ios_base::binary 添加到流构造函数中。

    【讨论】:

      猜你喜欢
      • 2012-08-26
      • 2021-12-03
      • 2015-10-12
      • 2011-09-26
      • 2014-01-04
      • 1970-01-01
      • 2018-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多