Как сериализовать 3D массив с boost? - PullRequest
0 голосов
/ 21 мая 2011

Хорошо, я недавно переключился на Boost и частично понимаю сериализацию простых объектов или простых классов (урок Boost меня смущает), но как я могу сериализовать 3D-массив, который содержит члены класса?

У меня есть массив (std :: vector) с именем TileList, который содержит объекты класса Tile, а класс Tile содержит только две переменные: int TileID и int TilePassability.

Я попытался сделать это так, как это делает учебник по сериализации в не навязчивом методе и методе контейнера STL, но я просто получаю в ответ стек ошибок. Может кто-нибудь объяснить, как это сделать правильно? Спасибо.

1 Ответ

2 голосов
/ 22 мая 2011

Итак, я понимаю, что у вас есть что-то вроде этого (это не совсем 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 член должен быть шаблоном (ну, не совсем; но пока вы не знаете библиотеку немного лучше, он должен быть), поэтому все его тело должно быть включено в объявление класса (если вы не используете явное создание экземпляров, но это также не то, что для начинающих).

Вы также можете разделить его на 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.

...