好的,我最近改用了boost,我开始理解序列化简单对象或简单类(升级教程让我困惑),但是如何序列化包含类成员的3D数组呢?
我有一个名为TileList的数组(std :: vector),它包含Tile类的对象,而Tile类只包含两个变量int TileID和int TilePassability。
我试过这样做,因为序列化教程在非突兀方法和STL容器方法中做,但我只是得到一堆错误作为回报。有人可以解释一下如何正确地做到这一点吗?谢谢。
答案 0 :(得分:2)
所以我知道你有类似的东西(这不是一个真正的3D数组,如果我误读了你想要序列化的确切代码):
struct Tile {
int id, passability;
};
std::vector<Tile> tileList;
由于std::vector
已经可以通过标准的Boost.Serialization工具进行序列化,因此您只需要Tile
可序列化。最简单的方法是添加一个同时执行加载和保存的serialize
成员。
struct Tile {
int id, passability;
template <typename Archive>
void serialize(Archive& ar, const unsigned version) {
ar & id;
ar & passability;
}
};
Aand就是这样,你的类型现在是可序列化的。需要考虑的特殊事项包括集体成员是私有的 - 在这种情况下你需要为Boost.Serialization添加朋友声明,即
class Tile {
int id, passability;
friend class boost::serialization::access;
template <typename Archive>
void serialize(Archive& ar, const unsigned version) {
ar & id;
ar & passability;
}
public:
Tile(int, int);
};
serialize
成员必须是一个模板(好吧,不是真的;但是直到你知道库有点好,它必须是),所以它的整个主体必须包含在类声明中(除非你使用显式实例化,但这也不适合初学者。)
您也可以将其拆分为save
和load
成员,但在开始使用版本控制之前,这没有用。它看起来像这样:
struct Tile {
int id, passability;
BOOST_SERIALIZATION_SPLIT_MEMBER()
template <typename Archive>
void save(Archive& ar, const unsigned version) { ... }
template <typename Archive>
void load(Archive& ar, const unsigned version) { ... }
};
这使得矢量的类型可以序列化。序列化矢量本身只是archive & tileList
。