【发布时间】:2017-07-04 08:32:05
【问题描述】:
我面临一个 std::length 异常,使用谷物库反序列化一个充满我自己的类的 std::vector。我认为如果我给出一些代码是最简单的。这是我的课:
#include "cereal/archives/portable_binary.hpp"
#include "cereal/archives/json.hpp"
#include "cereal/types/vector.hpp"
enum class myType {
None, unset, Type1, Type2, Type3
};
class myClass
{
public:
myClass();
myClass(size_t siz);
~myClass();
std::vector<size_t> idxs;
myType dtype;
bool isvalid;
// This method lets cereal know which data members to serialize
template<class Archive>
void serialize(Archive & archive)
{
archive(CEREAL_NVP(dtype), CEREAL_NVP(isvalid), CEREAL_NVP(idxs));
}
protected:
private:
};
idxs 成员不一定总是具有相同的大小。 经过一些计算,我得到一个
std::vector<myClass> allData;
我想序列化并稍后在另一个应用程序中反序列化。这是我的序列化代码:
std::ofstream ofile(allDataFilename.c_str());
if (ofile.good())
{
cereal::PortableBinaryOutputArchive theArchive(ofile);
theArchive(allData);
//ofilefp.close(); // Do not close because of RAII where dtor of cereal archive does some work on file!
}
else
{
std::cout << "Serialization to portable binary archive failed. File not good." << "\n";
}
生成的数据文件不是空大小,也不是全为零,所以从外观上看是没问题的。 这是我在其他应用程序中反序列化的方法:
std::string allDataFilename("C:\\path\\to\\file\\data.dat");
std::ifstream infile(allDataFilename.c_str());
std::vector<myClass> myDataFromDisk;
if (infile.good())
{
cereal::PortableBinaryInputArchive inArchive(infile);
inArchive >> myDataFromDisk;
}
else
{
std::cout << "Data file unavailable." << "\n";
}
当我运行这个反序列化代码时,我得到一个异常“std::length_error”。不知何故,与此错误相关的讨论是here,但对我来说,这似乎与我的情况无关。 (或者是吗?)
我尝试使用单独的加载/保存函数进行反序列化/序列化,因为我不确定谷物文档的这一部分是否适用于此:
如果可能,最好使用单个内部序列化 方法,尽管在必要时可以使用拆分方法(例如 在加载类时动态分配内存)。
我还尝试在基于范围的 for 循环中分别归档 idxs 成员的每个向量元素(就像在内部谷类食品中所做的那样),但这两件事都没有帮助。
这两个应用程序都是使用 Visual Studio 2015 Update 3 编译的。我使用当前的谷物 v1.2.2,但也尝试使用谷物 v1.1.2,它给了我一个有点相同的序列化结果。
顺便说一句:它适用于谷物 JSON 存档。但只有在我将序列化调用更改为
archive(CEREAL_NVP(dtype), CEREAL_NVP(isvalid), CEREAL_NVP(idxs));
而当向量成员首先出现在序列化时,它不适用于 JSON。但这可能完全不相关。
archive(CEREAL_NVP(idxs), CEREAL_NVP(dtype), CEREAL_NVP(isvalid));
现在我的问题:
1) 这是序列化应该与谷物一起使用的方式吗?
2) 我需要添加更多的序列化函数吗?例如。到枚举类?
最好的问候 平均编码器
【问题讨论】:
标签: c++ c++11 serialization vector cereal