好的,我最近切换到 boost 并且我部分理解序列化简单对象或简单类(boost 教程让我感到困惑),但是如何序列化包含类成员的 3D 数组?
我有一个名为 TileList 的数组(std::vector),它包含属于 Tile 类的对象,而 Tile 类只包含两个变量 int TileID 和 int TilePassability。
我尝试像序列化教程在非侵入式方法和 STL 容器方法中那样做,但我只是得到一堆错误作为回报。有人可以解释如何正确地做到这一点吗?谢谢你。
好的,我最近切换到 boost 并且我部分理解序列化简单对象或简单类(boost 教程让我感到困惑),但是如何序列化包含类成员的 3D 数组?
我有一个名为 TileList 的数组(std::vector),它包含属于 Tile 类的对象,而 Tile 类只包含两个变量 int TileID 和 int TilePassability。
我尝试像序列化教程在非侵入式方法和 STL 容器方法中那样做,但我只是得到一堆错误作为回报。有人可以解释如何正确地做到这一点吗?谢谢你。
所以我知道你有这样的东西(这不是一个真正的 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;
}
};
就是这样,你的类型现在是可序列化的。需要考虑的特殊事项包括类成员是私有的——在这种情况下,您需要为 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
member 必须是一个模板(嗯,不是真的;但在你对库有更好的了解之前,它必须是),所以它的整个主体必须包含在类声明中(除非你使用显式实例化,但这也不是适合初学者的东西)。
您也可以将其拆分为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
.