gpt4 book ai didi

CEREAL 无法序列化 - 无法从输入流异常中读取

转载 作者:行者123 更新时间:2023-12-01 03:03:56 28 4
gpt4 key购买 nike

我发现了一个特定的 100MB bin 文件(在最小示例中为 CarveObj_k5_rgbThreshold10_triangleCameraMatches.bin),其中 Cereal 无法加载抛出异常“无法从输入流读取 368 字节!读取 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

视窗 10

这是一个错误吗?我错过了一些明显的东西吗?
同时创建了一个错误报告: https://github.com/USCiLab/cereal/issues/607

最佳答案

在此特定实例中,binary.hpp 的第 105 行抛出的“无法读取输入流异常”是因为 ios::binary ifstream 中缺少标志构造函数调用。 (这是必需的,否则 ifstream 将尝试将某些文件内容解释为回车和换行符。更多信息见 this question。)

因此,从 .bin 文件读取的最小示例中的几行代码应如下所示:

vector<vector<float>> testInBinary;
{
std::ifstream is("CarveObj_k5_rgbThreshold10_triangleCameraMatches.bin", ios::binary);
cereal::BinaryInputArchive iarchive(is);
iarchive(testInBinary);
}

但是,即使在修复此问题后,该特定 .bin 文件中的数据似乎也存在另一个问题,因为当我尝试读取它时,我抛出了一个不同的异常,似乎是由错误编码的大小值引起的。我不知道这是否是复制到/从 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 上的示例代码中,您还缺少 ios::binary ofstream 上的旗帜编写 .bin 文件时的构造函数:
/// Produced by:
// {
// std::ofstream outFile(base + "_triangleCameraMatches.bin");
// cereal::BinaryOutputArchive oarchive(outFile);
// oarchive(m_triangleCameraMatches);
// }

可能值得尝试设置标志。希望有些帮助。

关于CEREAL 无法序列化 - 无法从输入流异常中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59354426/

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