【发布时间】:2017-08-19 11:33:28
【问题描述】:
我正在使用<boost/serializaton>,我需要序列化一个向量矩阵,X1 类的成员,比如:
vector<vector<vector<vector<X2>>>> V;
地点:
- V 被 X1 的构造函数初始化为 V[N][M][S]。
- X2 是一个类,拥有一些成员和 getter/setter,有自己的 serialize() 函数(序列化两个 std::strings),它也由 X1 的 constr 初始化。
问题是:如何序列化 V?
我尝试了不同的方法,但都没有奏效。我已经阅读了 Boost 站点中的文档及其示例,但是我遗漏了一些东西。 事情是这样的:
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/serialization/vector.hpp>
// I tried with the simplest way:
class X1{
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive& ar, const unsigned int version) {
ar & V;
}
//…
};
// or by calling serialization in a explicit way for each object of V:
class X1{
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive& ar, const unsigned int version) {
ar & V;
for (auto it = V.begin(); it != V.end(); ++it) {
ar & *it;
for (auto jt = (*it).begin(); jt != (*it).end(); ++jt) {
ar & *jt;
for (auto kt = (*jt).begin(); kt != (*jt).end(); ++kt) {
ar & *kt;
for (auto wt = (*kt).begin(); wt != (*kt).end(); ++wt) {
ar & *wt;
}
}
}
}
}
//…
};
我尝试了后者(也许我应该反过来做?)也使用范围和其他不同的方式,老实说我已经删除并且不记得了:它序列化但从序列化文件读取时崩溃。 我希望表达清楚,这是我的第一个问题。 感谢您的帮助!
【问题讨论】:
-
之前有人告诉过你,使用这样的数据结构是一个非常糟糕的主意吗?如果没有,让我成为第一个。正确的方法是创建一个平面数组和一个访问器方法,该方法将根据其索引计算您需要的元素的位置。然后,如果您这样做,您将不需要万亿次循环,序列化将变得微不足道,性能将从中受益。
-
是的,我知道我可以使用平面数组来完成,但我想使用 STL 容器来简化任务,因为此序列化的性能是强制性的,因为我将序列化 V 一次。无论如何,如果我不能让它工作,我会听从你的建议。谢谢。
-
您仍然可以将 STL 容器与一维数组一起使用。
vector<X2>没什么问题。 -
操作,我的意思是“因为这个序列化的性能并不重要”
标签: c++ matrix serialization vector boost