【发布时间】:2013-09-25 04:12:46
【问题描述】:
我正在寻找一种在 C++ 中序列化大型复杂对象的方法。我一直在考虑使用 boost 序列化 api,但我不确定是否可以序列化以这种方式实现的对象。
在我的程序中,我有以下对象:
typedef map<float, float> SignalData;
typedef pair<float,float> TimeValuePair;
class SignalDatabaseNG : public SignalDatabase
{
(...)
private:
vector<SingleSignal *> all_signals;
(...)
};
class SingleSignalAsStdMap: public SingleSignal{
private:
SignalData * signalData;
(...)
};
class IntegrationComparator : public Comparator {
private:
map<SignalData *, float> * preComputedIntegrals;
(...)
public:
IntegrationComparator();
float compare(SignalData *a, SignalData *b);
void preComputeIntegralsForAll(SignalDatabase * database);
(...)
};
SignalDatabase 是一个类,其最重要的作用是保存程序所需的所有数据。信号表示为两个浮点数(时间和值)的映射,所有信号都保存在此类映射的向量中。
它正在以下列方式填充数据:
SignalDatabaseNG * signalDatabase = TestConfiguration::getSignalDatabase();
IntegrationComparator * integrationComparator = new IntegrationComparator();
integrationComparator->preComputeIntegralsForAll(signalDatabase);
TestConfiguration::getSignalDatabase() 返回一个数据库对象,其中包含计算积分所需的数据(在程序运行开始时从文本文件中读取)。然后,创建integrationComparator 对象并调用preComputeIntegralsForAll(SignalDatabase * db),它执行计算。最后,integrationComparator 内部的map<SignalData *, float> * preComputedIntegrals 填充了数据。
这种积分计算需要大量时间(10 个信号大约需要 60 秒,而我需要对 ~220000 个信号进行计算)。
我希望能够运行一次,然后对其进行序列化,然后在每个程序运行时重复使用它(数据不会经常更改,因此可以节省大量时间)。
问题在于映射将指向信号对象的指针映射到整数值。但是,在下一次运行中,数据库将从头开始创建,并且指针内的所有地址都会更改。 可以同时序列化信号数据库和预计算的积分数据库,但是也不能保证反序列化后数据库中的信号会在内存中的相同位置,因此integresComparator内部的指针也会完全错误。
有没有人知道如何进行这种序列化(最好不必重写类的整个结构)?
【问题讨论】:
-
你真的很喜欢他们的指针,不是吗?
-
这可能是因为我觉得java最舒服,而且一切都是指针,我认为这是一件好事。但在这种情况下,数据总计约 5GB,您希望我按值传递所有内容吗?
标签: c++ pointers serialization boost