使用映射增强二进制序列化,并在中的序列化时加倍崩溃
Boost binary serialization with a map and doubles crashes on serialize in
这是一个代表我的问题的示例。除非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;
}
您需要序列化为二进制文件流。将ios_base::binary添加到流构造函数中。
相关文章:
- 如何在C++中序列化结构数据
- 序列化,没有库的整数,得到奇怪的结果
- 如何知道QDataStream不能反序列化某些内容
- 如何使用Python从C++中读取谷物序列化数据
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 自定义对象的dlib序列化在gcc中失败
- C++boost序列化多态性问题
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 在 cpp 中的平面缓冲区中序列化对象
- 每次进行继承时都需要提升::序列化::base_object吗?
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 提升序列化 1:73 的向后兼容性问题
- 崩溃:分段故障:增强序列化加载 - 用null调用构造函数
- 提升序列化binary_oarchive崩溃
- 使用提升序列化时崩溃很多次
- c++增强序列化如何防止不正确的文件崩溃
- 使用映射增强二进制序列化,并在中的序列化时加倍崩溃
- 反序列化中的文件损坏,如何防止崩溃