0

好的,我最近切换到 boost 并且我部分理解序列化简单对象或简单类(boost 教程让我感到困惑),但是如何序列化包含类成员的 3D 数组?

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

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

4

1 回答 1

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;
   }
};

就是这样,你的类型现在是可序列化的。需要考虑的特殊事项包括类成员是私有的——在这种情况下,您需要为 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);
};

serializemember 必须是一个模板(嗯,不是真的;但在你对库有更好的了解之前,它必须是),所以它的整个主体必须​​包含在类声明中(除非你使用显式实例化,但这也不是适合初学者的东西)。

您也可以将其拆分为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.

于 2011-05-21T21:14:12.950 回答