如何使用boost序列化3D阵列?

时间:2011-05-21 19:45:54

标签: c++ visual-studio-2010 boost-serialization multidimensional-array

好的,我最近改用了boost,我开始理解序列化简单对象或简单类(升级教程让我困惑),但是如何序列化包含类成员的3D数组呢?

我有一个名为TileList的数组(std :: vector),它包含Tile类的对象,而Tile类只包含两个变量int TileID和int TilePassability。

我试过这样做,因为序列化教程在非突兀方法和STL容器方法中做,但我只是得到一堆错误作为回报。有人可以解释一下如何正确地做到这一点吗?谢谢。

1 个答案:

答案 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成员必须是一个模板(好吧,不是真的;但是直到你知道库有点好,它必须是),所以它的整个主体必须​​包含在类声明中(除非你使用显式实例化,但这也不适合初学者。)

您也可以将其拆分为saveload成员,但在开始使用版本控制之前,这没有用。它看起来像这样:

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