Десериализовать несколько значений с помощью boost::serialize (с SSCCE)

Я пытаюсь сериализовать и десериализовать объект с помощью библиотеки boost::serialize. Мне нужно разделить функцию сохранения и загрузки.

Я использую библиотеку описанную в официальном туториале. Мои функции сохранения и загрузки выглядят так:

friend class boost::serialization::access;

template<typename Archive>
void save(Archive& ar, const unsigned version) const {
    ar & name;
    ar & NType;
    ar & NTherm;
    ar & NRun;
//...
}

template<class Archive>
void load(Archive& ar, const unsigned int version) {
    ar & name;
    ar & NType;
    ar & NTherm;
    ar & NRun;
//...
}
BOOST_SERIALIZATION_SPLIT_MEMBER()

Эти функции реализованы в заголовке класса. Я сериализую и десериализую так: { //Сериализуем std::ofstream ofs("output.txt"); boost::archive::text_oarchive oa(ofs); oa ‹‹ Объект; }

{
    //Deserialize
    Class newObject;
    std::ifstream ifs("output.txt");
    boost::archive::text_iarchive ia(ifs);
    ia >> newObject;
}

Сериализация работает нормально, но при десериализации возникает исключение в ar & NRun;.

Появляется всплывающее сообщение об ошибке: Это приложение запросило у среды выполнения необычный способ его завершения. Отладка показала, что было выдано исключение слишком длинное имя класса.

Как я могу это исправить?

Обновление: добавлены скобки во фрагмент кода.

Update2: я добавил SSCCE.

main.cpp:

#include <iostream>
#include "simulation.h"
#include <fstream>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/split_member.hpp>


int main()
{
    Simulation *sim;
    sim = new Simulation(2,25,25,25,100,500,1000,"Sim");
    {
        std::ofstream ofs("output.txt");
        boost::archive::text_oarchive oa(ofs);
        oa << sim;
    }

    {
        Simulation newSim;
        std::ifstream ifs("output.txt",std::ios::binary);
        boost::archive::text_iarchive ia(ifs);
        ia >> newSim;
    }
}

simulation.h:

#ifndef SIMULATION_H_
#define SIMULATION_H_
#include <string>
#include <boost/serialization/access.hpp>
#include <boost/serialization/split_member.hpp>
#include <boost/serialization/string.hpp>

class Simulation {

public:
    //Constructors
Simulation(int anzType, int x=25, int y=25, int z=25, int NT = 100, int NS = 500, int NR = 1000, std::string n = "");
Simulation();           //Defaultconstructor für Boost Serialisierung

    //Destructor
    virtual ~Simulation();


private:
    int NType;             
    int NTherm;             
    int NStep;             
    int NRun;             
    std::string name;
    int Lx;
    int Ly;
    int Lz;
    int LyLz;

    friend class boost::serialization::access;

    template<typename Archive>
    void save(Archive& ar, const unsigned version) const {
        ar & name;
        ar & NType;
        ar & NTherm;
        ar & NRun;
        ar & NStep;
    }

    template<class Archive>
    void load(Archive& ar, const unsigned int version) {
        ar & name;
        ar & NType;
        ar & NTherm;
        ar & NRun;
        ar & NStep;
    }
    BOOST_SERIALIZATION_SPLIT_MEMBER()
};
#endif /* SIMULATION_H_ */

simulation.cpp:

#include "Simulation.h"


Simulation::Simulation() {

}


Simulation::Simulation(int anzType, int x, int y, int z, int NT, int NS, int NR, std::string n) {
    name = n;
   NType = anzType;
   NTherm = NT;
    NStep = NS;
    NRun = NR;
    Lx = x;
    Ly = y;
    Lz = z;
    LyLz = y*z;
}

Simulation::~Simulation() {

}

person pyman    schedule 30.01.2015    source источник


Ответы (1)


ОБНОВЛЕНИЕ Поскольку вы обновили вопрос с помощью SSCCE, это очевидно.

Вы сериализуете файл Simulation*. А затем вы пытаетесь десериализовать файл Simulation&. Неудивительно, что это не сработает.

Жить на Coliru

#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/access.hpp>
#include <fstream>
#include <iostream>

class Simulation {

  public:
    // Constructors
    Simulation(int anzType, int x = 25, int y = 25, int z = 25, int NT = 100, int NS = 500, int NR = 1000, std::string n = "");
    Simulation(); // Defaultconstructor für Boost Serialisierung

    // Destructor
    virtual ~Simulation();

  private:
    std::string name;
    int         NType, NTherm, NStep, NRun;
    int         Lx, Ly, Lz, LyLz;

    friend class boost::serialization::access;

    template <typename Archive> void serialize(Archive &ar, unsigned) {
        ar & name;
        ar & NType;
        ar & NTherm;
        ar & NRun;
        ar & NStep;
    }
};

Simulation::Simulation() {}

Simulation::Simulation(int anzType, int x, int y, int z, int NT, int NS, int NR, std::string n)
  : name(n), NType(anzType), NTherm(NT), NStep(NS), NRun(NR),
    Lx(x), Ly(y), Lz(z), LyLz(y * z)
{
}

Simulation::~Simulation() {}

int main() {
    Simulation *sim = new Simulation(2, 25, 25, 25, 100, 500, 1000, "Sim");
    {
        std::ofstream ofs("output.txt", std::ios::binary);
        boost::archive::text_oarchive oa(ofs);
        oa << sim;
    }

    {
        Simulation* newSim = nullptr;
        std::ifstream ifs("output.txt", std::ios::binary);
        boost::archive::text_iarchive ia(ifs);
        ia >> newSim;

        delete newSim;
    }
}
person sehe    schedule 30.01.2015
comment
Ни std::ios::binary, ни явный сброс не решают проблему. Потоки используются в отдельных функциях программы. - person pyman; 30.01.2015
comment
Затем вам нужно сделать это SSCCE. Код в порядке. Проблема в другом - person sehe; 30.01.2015
comment
Я только что увидел, что программа выдает следующую ошибку: Invalid parameter passed to C runtime function. - person pyman; 30.01.2015
comment
@pyman Я только что заметил твое обновление. Я сопоставляю это с соответствующим образом обновленным ответом. В следующий раз подумайте о том, чтобы показать соответствующие детали. (У нас не было никаких оснований предполагать, что Object на самом деле не является объектом :)) - person sehe; 30.01.2015
comment
Упс. Я не так долго программирую на C++ и просто пропустил это. Конечно, это очевидно... - person pyman; 30.01.2015