Как загрузить объекты с помощью конструктора specifici c с хлопьями вместо конструктора по умолчанию? - PullRequest
0 голосов
/ 27 мая 2020

Я думаю, может быть, мой вопрос сбивает с толку / неясен / утомителен для чтения из-за его объема, поэтому, если вы хотите сохранить детали, просто рассмотрите название вопроса как фактический вопрос, который я задаю. Это все, что мне действительно нужно знать.

Я делаю функции 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

По сути, у меня действительно нет никаких ошибок, просто я не знаю, как работает загрузка и создание вещей из хлопьев. Любое руководство поможет.

...