Итак, я понимаю, что у вас есть что-то вроде этого (это не совсем 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
.