Ошибка сериализации для структуры, содержащей вектор векторов других структур - PullRequest
0 голосов
/ 13 апреля 2019

Я работаю над финальным проектом для класса и пытаюсь использовать библиотеку зерновых для сериализации структуры, содержащей вектор векторов структур другого типа, но это не удается.Другой (содержащийся в векторе) тип структуры имеет функцию сериализации, которая работает (проверена).Когда я пытаюсь сериализовать и десериализовать контейнерную структуру, я получаю сообщение об ошибке «Не удалось прочитать 8 байтов из входного потока! Чтение 0»

Я успешно сериализовал другую структуру, которая содержит вектор векторов структур, поэтомуЯ знаю, что это должно быть возможно.Когда я сделал это, все строки, которые были в структуре в векторах, можно было увидеть в файле, в который я сохранил вывод.Однако, когда я сериализовал структуру контейнера для этого проекта, результирующий файл содержит только строки первых двух внутренних структур в первом подвекторе вектора в классе контейнера.(например: содержит struct.vec [0] [0] .string и struct.vec [0] [1] .string, но не любые из 14 других).

В верхней части файласодержащий структуру контейнера, у меня есть

#include <vector>
#include <string>
#include <random>
#include "region.h"
#include "constants.h"
#include "cereal/archives/binary.hpp"
#include "cereal/types/vector.hpp"
#include "cereal/types/string.hpp"

Он имеет следующие переменные-члены (переименован здесь).Region - это структура с работающей функцией сериализации .:

vector<vector<Region>> game_map;
int x;
int y;

Функция сериализации контейнера (Country):

template<class Archive>
void serialize(Archive &archive) {
    archive(game_map, x, y);
}

Это код, выдающий ошибку:

TEST_CASE("Serialize manually created country", "[serialize]") {
        Here, I create a vector of vectors of Regions called new_game_map, and I think I did so correctly, as I used it to create country later and that had the right values for everything (checked with printing).
    { //First creating country object, serializing it, and saving it to a file
        stringstream ss;
        cereal::BinaryOutputArchive oarchive(ss);

        Country country;
        country.game_map = new_game_map;
        country.x = 49;
        country.y = -3;

        oarchive(country);

        ofstream output_stream;
        output_stream.open("test_cereal_save_file.txt");
        string save;
        ss >> save;
        output_stream << save;
        output_stream.close();
    }

    { //Now getting saved data and turning it back into a country object, then checking that it equals original.
        stringstream ss;
        string save;
        ifstream input_stream;
        input_stream.open("test_cereal_save_file.txt");
        input_stream >> save;
        ss << save;
        input_stream.close();
        cereal::BinaryInputArchive iarchive(ss);

        Country country;
        iarchive(country);

        Country expected_country;
        expected_country.game_map = new_game_map;
        expected_country.x = 49;
        expected_country.y = -3;

        REQUIRE(expected_country == country);
    }

Я ожидаю, что страна, созданная с зерновыми, будет равна той, которую я создал позже, но это не так.Он не содержит переменных, и Catch2 выдает ошибку «Не удалось прочитать 4 байта из входного потока! Чтение 0»

...