【发布时间】:2015-04-19 21:13:59
【问题描述】:
我正在创建一个存储大量双打的类,用于通过 boost 保存/加载。加载需要尽可能快,所以让二进制格式工作是目标。
基本上,我有一个存储结构向量的类:
vector<DataChunk>
DataChunk 存储一个固定长度的双精度数组
double data[2048]
当我使用文本存档 (text_iarchive) 测试功能时,一切正常。但是,当使用二进制存档时,我在反序列化类时遇到内存访问冲突。
更奇怪的是,如果我用相同的双精度值填充双精度数组(即 data[2048] 的所有元素都等于 12345),它就可以工作。不过,不同的双精度值似乎会使它崩溃(见下文)。
这是我的 RawData 类:
#pragma once
#include <boost\serialization\vector.hpp>
#include <boost\serialization\array.hpp>
using namespace std;
struct DataChunk
{
public:
double data[2048]; //THIS IS THE PROBLEM AREA
int end;
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive& ar, const unsigned int version)
{
ar & data;
ar & end;
}
};
class RawData
{
private:
vector<DataChunk> chunks;
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive& ar, const unsigned int version)
{
ar & chunks;
}
public:
void add_chunk(DataChunk chunk){chunks.push_back(chunk);};
vector<DataChunk> get_chunks(){return chunks;};
static void save(RawData rd, string path);
static bool load(RawData & rd, string path);
void add_raw_data(vector<double> raw_data);
vector<double> combine_chunks();
};
我的保存和加载功能如下所示:
void RawData::save(RawData rd, string path)
{
std::ofstream file(path);
if(file.good())
{
boost::archive::binary_oarchive oa(file, std::ios::binary);
//boost::archive::text_oarchive oa(file);
oa << rd;
}
file.flush();
file.close();
}
bool RawData::load(RawData & rd, string path)
{
std::ifstream file(path);
if(file.good())
{
boost::archive::binary_iarchive ia(file, std::ios::binary);
//boost::archive::text_iarchive ia(file);
ia >> rd;
file.close();
return true;
}
else
return false;
}
在我的主要功能中,我这样测试它:
string path = "test.data";
RawData old_data;
vector<double> raw_data;
for(int i = 0; i < 5000; i++)
raw_data.push_back(i * 2048); //change this to constant value and it works...
old_data.add_raw_data(raw_data);
//serialize
RawData::save(old_data, path);
//deserialize
RawData new_data;
RawData::load(new_data, path);
//grab the chunks and test the values
vector<DataChunk> chunks_in = new_data.get_chunks();
for(int i = 0; i < chunks_in.size(); i++)
for(int j = 0; j < chunks_in[i].end; j++)
cout<<chunks_in[i].data[j]<<", ";
return 0;
【问题讨论】:
-
似乎
RawData与std::deque<double>差不多?
标签: c++ arrays serialization boost binary