提升序列化在特定文件大小后抛出"input stream error"
Boost serialization throws "input stream error" after a certain file size
我正在使用Boost::serialization来读取/写入包含3d模型的文件。
在文件达到一定大小之后(大约8-12kb+),每次我尝试读取文件时,序列化都会抛出一个"输入流错误"异常。在那之前,它每次都工作得很好——例如,我可以成功地读/写一个1kb的模型12次,然后在第13次和以后,它会抛出异常!
序列化/反序列化的代码如下:
JonsPackagePtr ReadJonsPkg(const std::string& jonsPkgName)
{
std::ifstream jonsPkgStream(jonsPkgName.c_str(), std::fstream::binary || std::fstream::in);
JonsPackagePtr pkg(new JonsPackage()); // "JonsPackagePtr" is a boost_shared_ptr typedef
if (jonsPkgStream && jonsPkgStream.good() && jonsPkgStream.is_open())
{
boost::archive::binary_iarchive iar(jonsPkgStream);
iar >> (*pkg.get());
}
return pkg;
}
bool WriteJonsPkg(const std::string& jonsPkgName, const JonsPackagePtr pkg)
{
std::ofstream outStream(jonsPkgName.c_str(), std::fstream::out | std::fstream::binary);
bool ret = false;
if (outStream.is_open())
{
boost::archive::binary_oarchive oar(outStream);
oar << (*pkg.get());
ret = true;
}
return ret;
}
这是我归档的内容:
/* PackageHeader definition */
struct PackageHeader
{
std::string mSignature;
uint8_t mMajorVersion;
uint8_t mMinorVersion;
PackageHeader();
};
/* PackageMesh definition */
struct PackageMesh
{
std::vector<float> mVertexData;
std::vector<uint32_t> mIndiceData;
PackageMesh();
};
/* PackageModel definition */
struct PackageModel
{
std::string mName;
std::vector<PackageModel> mChildren;
std::vector<PackageMesh> mMeshes;
Mat4 mTransform;
PackageModel();
};
/* JonsPackage definition */
struct JonsPackage
{
PackageHeader mHeader;
std::vector<PackageModel> mModels;
JonsPackage();
};
typedef boost::shared_ptr<JonsPackage> JonsPackagePtr;
JonsPackagePtr ReadJonsPkg(const std::string& jonsPkgName);
bool WriteJonsPkg(const std::string& jonsPkgName, const JonsPackagePtr pkg);
/* PackageHeader inlines */
inline PackageHeader::PackageHeader() : mSignature("jons"), mMajorVersion(LatestMajorVersion), mMinorVersion(LatestMinorVersion)
{
}
/* PackageModel inlines */
inline PackageModel::PackageModel() : mName(""), mTransform(1.0f)
{
}
/* PackageMesh inlines */
inline PackageMesh::PackageMesh()
{
}
/* JonsPackage inlines */
inline JonsPackage::JonsPackage()
{
}
最后是我的非侵入式序列化定义:
namespace boost
{
namespace serialization
{
template<class Archive>
void serialize(Archive & ar, JonsEngine::PackageHeader& header, const unsigned int version)
{
ar & header.mMajorVersion;
ar & header.mMinorVersion;
ar & header.mSignature;
}
template<class Archive>
void serialize(Archive & ar, JonsEngine::PackageModel& model, const unsigned int version)
{
ar & model.mName;
ar & model.mChildren;
ar & model.mMeshes;
ar & model.mTransform;
}
template<class Archive>
void serialize(Archive & ar, JonsEngine::PackageMesh& mesh, const unsigned int version)
{
ar & mesh.mVertexData;
ar & mesh.mIndiceData;
}
template<class Archive>
void serialize(Archive & ar, JonsEngine::JonsPackage& pkg, const unsigned int version)
{
ar & pkg.mHeader;
ar & pkg.mModels;
}
template<class Archive>
void serialize(Archive & ar, glm::detail::tmat4x4<glm::mediump_float> transform, const unsigned int version)
{
ar & transform[0];
ar & transform[1];
ar & transform[2];
ar & transform[3];
}
template<class Archive>
void serialize(Archive & ar, glm::detail::tvec4<glm::mediump_float> vec, const unsigned int version)
{
ar & vec.x;
ar & vec.y;
ar & vec.z;
ar & vec.w;
}
} // namespace serialization
} // namespace boost
正如我上面提到的,只有在达到一定的文件大小(8-12kb+)之后,当我试图读取它时,它才开始抛出异常。到底为什么会这样,可能是什么原因导致的?直到现在,一切都很好……
谢谢
在ReadJonsPkg
中应该按位使用,或者:std::fstream::binary | std::fstream::in
相关文章:
- "error: no matching function for call to"构造函数错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- C++错误:"error: int aaa::bbb is protected within this context"
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- "input.length();"的目的是什么?
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- 使用 cmake 的 LLVM 构建在 tsan_libdispatch_mac.cc 期间失败; "Error: conflicting types for ..."
- C++ "error: invalid use of void expression"
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 如何修复"error: ‘_1’ was not declared in this scope"?
- 如何使用"derived input class"创建派生类?
- 从不同目录执行时"symbol lookup error:",否则从构建目录执行时按预期工作
- 对象声明中的模板"error: expected expression"
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- SWIG 不会扩展嵌套宏"Error: Syntax error in input(3)"
- 提升序列化在特定文件大小后抛出"input stream error"
- "Syntax error in input" when SWIGging Boost.Geometry?
- SWIG:%忽略不断给出"Syntax error in input(1)"