提升序列化,类包括指针
Boost serialization, class including pointer
我目前正在研究提升序列化,我进入了一个无法真正前进的时刻。我有一个类顺序,其中包含指向表和服务员类的指针。我想补充一点,所有其他类的序列化都工作得很好,它的顺序会产生问题。当我尝试在我的主订单中序列化订单时,我得到了一个豁免:控制台应用程序 1.exe 中0x77A03FC8时未处理的异常:内存位置 0x0081C42C Microsoft C++异常:boost::存档::archive_exception。和 + e {m_buffer=0x0081c6f4 "unregistered class - derived class not registered or exported" code=unregistered_class (2) } const boost::archive::archive_exception &您是否知道如何使此连接在序列化调用中正常工作?
Order.h
#pragma once
#include <vector>
#include <string>
#include <iostream>
#include <ctime>
#include "Meal.h"
#include "Table.h"
#include "Waiter.h"
using namespace std;
enum Status { ASSIGNED, PROCESSED, CONFIRMED, SUBMITTED, BEING_PREPARED, READY, SERVED, CANCELED, PAID, FINALIZED };
class Order
{
private:
friend std::ostream & operator<<(std::ostream &os, const Order &tb);
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int /* file_version */) {
ar & ID & TimeAndDate & status & table & waiter & meals;
};
protected:
string TimeAndDate;
Status status;
Table * table;
Waiter * waiter;
string ID;
public:
typedef Meal * Meal_Pointer;
list<Meal_Pointer> meals;
Order(string,Table*,Waiter*);
Order():table(new Table),waiter(new Waiter) {};
string CurrentDateAndTime();
void UpdateStatus(Status);
void AssignWaiter(Waiter*);
void AssignTable(Table*);
void AddItem(Meal*);
void append(Meal *_bs)
{
meals.insert(meals.end(), _bs);
}
};
Order.cpp
#include "Order.h"
Order::Order(string id, Table* tab, Waiter* wait)
:ID(move(id)), table(tab), waiter(wait), status(ASSIGNED),
std::ostream & operator<<(std::ostream &os, const Order &tb)
{
//std::list<Meal *>::const_iterator it;
// note: we're displaying the pointer to permit verification
// that duplicated pointers are properly restored.
return os << ' ' << tb.ID << ' ' << tb.TimeAndDate << ' ' << tb.status << ' ' << tb.table << ' ' << tb.waiter << ' ' ;
/*for (it = tb.meals.begin(); it != tb.meals.end(); it++) {
os << 'n' << std::hex << "0x" << *it << std::dec << ' ' << **it;
}*/
}
template void Order::serialize<boost::archive::text_iarchive>(
boost::archive::text_iarchive & ar,
const unsigned int file_version
);
template void Order::serialize<boost::archive::text_oarchive>(
boost::archive::text_oarchive & ar,
const unsigned int file_ver
功能
void save_order(const Order &s, const char * filename) {
// make an archive
std::ofstream ofs(filename);
boost::archive::text_oarchive oa(ofs);
oa << s;
}
int main ()
{
filename = "order.txt";
save_order(myOrder, filename.c_str());
Order neworder;
restore_order(neworder, filename.c_str());}
您不显示相关代码。
您显示的代码混乱且损坏。
在这里,我已经修复了它,以便它可以编译:
住在科里鲁
显然,没问题。
// Order.h
//#pragma once
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/serialization/access.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/list.hpp>
#include <boost/serialization/string.hpp>
#include <ctime>
#include <fstream>
#include <iostream>
using namespace std;
struct Table {};
struct Waiter {};
struct Meal {};
namespace boost { namespace serialization {
template <typename Ar> void serialize(Ar&, Table&, unsigned) { }
template <typename Ar> void serialize(Ar&, Waiter&, unsigned) { }
template <typename Ar> void serialize(Ar&, Meal&, unsigned) { }
} }
enum Status { ASSIGNED, PROCESSED, CONFIRMED, SUBMITTED, BEING_PREPARED, READY, SERVED, CANCELED, PAID, FINALIZED };
class Order {
private:
friend std::ostream &operator<<(std::ostream &os, const Order &tb);
friend class boost::serialization::access;
template <class Archive> void serialize(Archive &ar, const unsigned int /* file_version */) {
ar &ID &TimeAndDate &status &table &waiter &meals;
}
protected:
string TimeAndDate;
string ID;
Table *table;
Waiter *waiter;
Status status;
typedef Meal *Meal_Pointer;
list<Meal_Pointer> meals;
public:
Order(string, Table *, Waiter *);
Order() : table(new Table), waiter(new Waiter){};
string CurrentDateAndTime();
void UpdateStatus(Status);
void AssignWaiter(Waiter *);
void AssignTable(Table *);
void AddItem(Meal *);
void append(Meal *_bs) { meals.insert(meals.end(), _bs); }
};
// Order.cpp
//#include "Order.h"
Order::Order(string id, Table *tab, Waiter *wait) : ID(move(id)), table(tab), waiter(wait), status(ASSIGNED) {}
std::ostream &operator<<(std::ostream &os, const Order &tb) {
return os << ' ' << tb.ID << ' ' << tb.TimeAndDate << ' ' << tb.status << ' ' << tb.table << ' ' << tb.waiter
<< ' ';
/*for (it = tb.meals.begin(); it != tb.meals.end(); it++) {
os << 'n' << std::hex << "0x" << *it << std::dec << ' ' << **it;
}*/
}
template void Order::serialize<boost::archive::text_iarchive>(boost::archive::text_iarchive &ar, const unsigned int file_version);
template void Order::serialize<boost::archive::text_oarchive>(boost::archive::text_oarchive &ar, const unsigned int file_ver);
void save_order(const Order &s, const char *filename) {
// make an archive
std::ofstream ofs(filename);
boost::archive::text_oarchive oa(ofs);
oa << s;
}
void restore_order(Order &s, const char *filename) {
std::ifstream ifs(filename);
boost::archive::text_iarchive ia(ifs);
ia >> s;
}
int main() {
std::string const filename = "order.txt";
{
Order myOrder;
save_order(myOrder, filename.c_str());
}
std::cout << std::ifstream(filename).rdbuf() << "n";
{
Order neworder;
restore_order(neworder, filename.c_str());
}
}
提示
您似乎正在做的是序列化类的多态实例(例如,从 Table、Waiter 或 Meal 派生)。在这种情况下,您需要注册派生类并正确序列化基:
- 序列化多态类型的常见混淆
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- 是否允许调用方对我的 Builder 类使用任何指针类型(包括智能指针)?
- 重构MFC消息映射以包括完全限定的成员函数指针
- for 循环包括指针
- 异常包括字符指针和整数指针
- 功能指针数组(包括成员功能)投掷模板专业化错误
- 提升序列化,类包括指针
- 用c++类模拟指针(包括delete)
- 赋值包括指针的结构体
- 没有指针(包括智能指针)或副本的高效工厂函数
- 如何处理指针截断在ATLMFC包括文件
- C程序的输出,包括前/后增量和指针