gpt4 book ai didi

c++ - 使用 boost::serialize 反序列化多个值(使用 SSCCE)

转载 作者:行者123 更新时间:2023-11-30 03:57:01 26 4
gpt4 key购买 nike

我尝试使用 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; 处抛出异常。

弹出一条错误消息说:此应用程序已请求运行时以一种不寻常的方式终止它。调试显示异常类名太长被抛出.

我该如何解决这个问题?

更新:在代码片段中添加了括号。

更新 2:我添加了一个 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_ */

模拟.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() {

}

最佳答案

更新由于您使用 SSCCE 更新了问题,所以很明显。

您序列化一个Simulation*。然后你尝试反序列化一个Simulation&。不出所料,这行不通。

Live On 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;
}
}

关于c++ - 使用 boost::serialize 反序列化多个值(使用 SSCCE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28237158/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com