Я думаю, может быть, мой вопрос сбивает с толку / неясен / утомителен для чтения из-за его объема, поэтому, если вы хотите сохранить детали, просто рассмотрите название вопроса как фактический вопрос, который я задаю. Это все, что мне действительно нужно знать.
Я делаю функции Save()
и Load()
для своей игры, используя сериализацию Cereal.
Cereal требует наличия метода сериализации в каждом сериализованный класс, чтобы члены были указаны для сериализации.
В следующем примере у меня есть unordered_map в классе, который я пытаюсь сериализовать, сохранить, десериализовать и загрузить. Сериализация и сохранение в двоичный файл, кажется, работают нормально, но проблема возникает, когда я загружаю из двоичного файла и десериализую, так как мне нужно указать зерновой, какой конструктор использовать для правильного построения:
ClientProp.h
class ClientProp : public Prop
{
public:
ClientProp(PropType type, float pX, float pY, float pZ, float rX, float rY, float rZ, float sX, float sY, float sZ, ClientWorldState* world, Camera* camera, Shader* shader, bool emitter);
//serialize method would also be here, pointing to some variables from the parent Prop class for serializing
};
ClientWorldState.h
class ClientWorldState : public World
{
private:
std::unordered_map<int, ClientProp> props;
public:
template<class Archive>
void ClientWorldState::serialize(Archive& archive)
{
archive(props);
}
};
Game.h
class Game
{
private:
std::shared_ptr<ClientWorldState> currentWorld;
public:
bool Load();
bool Save();
};
Game. cpp
bool Game::Load()
{
std::ifstream infile("props.dat", std::ios::binary | std::ios::out);
if (!infile) {
std::cout << "CLIENT_WORLD_STATE::LOAD: Could not open props.dat file for reading!" << std::endl;
return false;
}
{
cereal::PortableBinaryInputArchive iarchive(infile); //Create an input archive
iarchive(currentWorld); //Read the data from the archive
} //Archive goes out of scope, ensuring all contents are flushed
infile.close();
return true;
}
bool Game::Save()
{
std::ofstream outfile("props.dat", std::ios::binary | std::ios::out);
if (!outfile) {
std::cout << "CLIENT_WORLD_STATE::SAVE: Could not open props.dat file for saving!" << std::endl;
return false;
}
{
cereal::PortableBinaryOutputArchive oarchive(outfile); //Create an output archive
oarchive(currentWorld); //Write data to the archive
} //Archive goes out of scope, ensuring all contents are flushed
outfile.close();
return true;
}
Мне нужно было бы правильно построить ClientWorldState , и каждый ClientProp перезагружается в неупорядоченную карту, так что cereal не просто создает каждый объект с помощью конструктора по умолчанию, что нарушит процесс создания экземпляров моих игр, поскольку объекты содержат такие вещи, как внедрение зависимостей через конструктор.
Я читал в документации по зерновым о том, как вызывать конструкторы при загрузке хлопьев, но я не понимаю, куда мне следует поместить материал load_and_construct (почему он находится в пространстве имен зерновых в примере, и где это пространство имен будет размещено в моем коде ?), поскольку где бы я ни пытался его поставить, я либо получаю сообщение об ошибке, либо не могу получить доступ к необходимым данным для параметры конструктора: https://uscilab.github.io/cereal/assets/doxygen/structcereal_1_1LoadAndConstruct.html
По сути, у меня действительно нет никаких ошибок, просто я не знаю, как работает загрузка и создание вещей из хлопьев. Любое руководство поможет.