CEREAL 无法序列化 - 无法从输入流异常中读取
CEREAL failing to serialise - failed to read from input stream exception
我找到了一个特定的 100MB bin 文件(CarveObj_k5_rgbThreshold10_triangleCameraMatches.bin 在最小示例中),其中谷物无法加载抛出异常 "Failed to read 368 bytes from input stream! Read 288"
相应的 900MB XML 文件(CarveObj_k5_rgbThreshold10_triangleCameraMatches.xml 在最小的例子中),从相同的数据构建,加载正常。
XML 文件由
生成
// {
// std::ofstream outFile(base + "_triangleCameraMatches.xml");
// cereal::XMLOutputArchive oarchive(outFile);
// oarchive(m_triangleCameraMatches);
// }
二进制版本由
制作
// {
// std::ofstream outFile(base + "_triangleCameraMatches.bin");
// cereal::BinaryOutputArchive oarchive(outFile);
// oarchive(m_triangleCameraMatches);
// }
最小示例:https://www.dropbox.com/sh/fu9e8km0mwbhxvu/AAAfrbqn_9Tnokj4BVXB8miea?dl=0
使用的 Cereal 版本:1.3.0
MSVS 2017
Windows10
这是一个错误吗?我错过了一些明显的东西吗?
同时创建了一个错误报告:https://github.com/USCiLab/cereal/issues/607
在此特定实例中,binary.hpp 的第 105 行抛出的 "failed to read from input stream exception" 出现是因为 ifstream
构造函数调用中缺少 ios::binary
标志。 (这是必需的,否则 ifstream
将尝试将某些文件内容解释为回车符 return 和换行符。有关详细信息,请参阅 this question。)
因此,从 .bin 文件读取的最小示例中的几行代码应如下所示:
vector<vector<float>> testInBinary;
{
std::ifstream is("CarveObj_k5_rgbThreshold10_triangleCameraMatches.bin", ios::binary);
cereal::BinaryInputArchive iarchive(is);
iarchive(testInBinary);
}
然而,即使在修复此问题之后,该特定 .bin 文件中的数据似乎也存在另一个问题,因为当我尝试读取它时,我抛出了一个不同的异常,似乎是由错误编码引起的尺寸值。不过,我不知道这是否是复制 to/from Dropbox 的产物。
Cereal 二进制文件似乎没有 100MB 的基本限制。下面这个最小的例子创建了一个大约 256MB 的二进制文件并很好地读回它:
#include <iostream>
#include <fstream>
#include <vector>
#include <cereal/types/vector.hpp>
#include <cereal/types/memory.hpp>
#include <cereal/archives/xml.hpp>
#include <cereal/archives/binary.hpp>
using namespace std;
int main(int argc, char* argv[])
{
vector<vector<double>> test;
test.resize(32768, vector<double>(1024, -1.2345));
{
std::ofstream outFile("test.bin");
cereal::BinaryOutputArchive oarchive(outFile, ios::binary);
oarchive(test);
}
vector<vector<double>> testInBinary;
{
std::ifstream is("test.bin", ios::binary);
cereal::BinaryInputArchive iarchive(is);
iarchive(testInBinary);
}
return 0;
}
可能值得注意的是,在 Dropbox 上的示例代码中,您在编写 .bin 文件时还缺少 ofstream
构造函数中的 ios::binary
标志:
/// Produced by:
// {
// std::ofstream outFile(base + "_triangleCameraMatches.bin");
// cereal::BinaryOutputArchive oarchive(outFile);
// oarchive(m_triangleCameraMatches);
// }
可能值得尝试设置标志。希望其中一些有所帮助。
我找到了一个特定的 100MB bin 文件(CarveObj_k5_rgbThreshold10_triangleCameraMatches.bin 在最小示例中),其中谷物无法加载抛出异常 "Failed to read 368 bytes from input stream! Read 288"
相应的 900MB XML 文件(CarveObj_k5_rgbThreshold10_triangleCameraMatches.xml 在最小的例子中),从相同的数据构建,加载正常。
XML 文件由
生成 // {
// std::ofstream outFile(base + "_triangleCameraMatches.xml");
// cereal::XMLOutputArchive oarchive(outFile);
// oarchive(m_triangleCameraMatches);
// }
二进制版本由
制作 // {
// std::ofstream outFile(base + "_triangleCameraMatches.bin");
// cereal::BinaryOutputArchive oarchive(outFile);
// oarchive(m_triangleCameraMatches);
// }
最小示例:https://www.dropbox.com/sh/fu9e8km0mwbhxvu/AAAfrbqn_9Tnokj4BVXB8miea?dl=0
使用的 Cereal 版本:1.3.0
MSVS 2017
Windows10
这是一个错误吗?我错过了一些明显的东西吗? 同时创建了一个错误报告:https://github.com/USCiLab/cereal/issues/607
在此特定实例中,binary.hpp 的第 105 行抛出的 "failed to read from input stream exception" 出现是因为 ifstream
构造函数调用中缺少 ios::binary
标志。 (这是必需的,否则 ifstream
将尝试将某些文件内容解释为回车符 return 和换行符。有关详细信息,请参阅 this question。)
因此,从 .bin 文件读取的最小示例中的几行代码应如下所示:
vector<vector<float>> testInBinary;
{
std::ifstream is("CarveObj_k5_rgbThreshold10_triangleCameraMatches.bin", ios::binary);
cereal::BinaryInputArchive iarchive(is);
iarchive(testInBinary);
}
然而,即使在修复此问题之后,该特定 .bin 文件中的数据似乎也存在另一个问题,因为当我尝试读取它时,我抛出了一个不同的异常,似乎是由错误编码引起的尺寸值。不过,我不知道这是否是复制 to/from Dropbox 的产物。
Cereal 二进制文件似乎没有 100MB 的基本限制。下面这个最小的例子创建了一个大约 256MB 的二进制文件并很好地读回它:
#include <iostream>
#include <fstream>
#include <vector>
#include <cereal/types/vector.hpp>
#include <cereal/types/memory.hpp>
#include <cereal/archives/xml.hpp>
#include <cereal/archives/binary.hpp>
using namespace std;
int main(int argc, char* argv[])
{
vector<vector<double>> test;
test.resize(32768, vector<double>(1024, -1.2345));
{
std::ofstream outFile("test.bin");
cereal::BinaryOutputArchive oarchive(outFile, ios::binary);
oarchive(test);
}
vector<vector<double>> testInBinary;
{
std::ifstream is("test.bin", ios::binary);
cereal::BinaryInputArchive iarchive(is);
iarchive(testInBinary);
}
return 0;
}
可能值得注意的是,在 Dropbox 上的示例代码中,您在编写 .bin 文件时还缺少 ofstream
构造函数中的 ios::binary
标志:
/// Produced by:
// {
// std::ofstream outFile(base + "_triangleCameraMatches.bin");
// cereal::BinaryOutputArchive oarchive(outFile);
// oarchive(m_triangleCameraMatches);
// }
可能值得尝试设置标志。希望其中一些有所帮助。