在测试使用Boost序列化器的代码时,我发现在反序列化时抛出了std::length_error异常。我在Linux上运行了以下代码(在Windows上我没有看到这个问题)。我使用的是Boost 1.47.0版本。
我的序列化类:
class TestClass
{
public:
TestClass() {};
TestClass(const char* string1, const char* string2, const char* string3):
string1(string1),
string2(string2),
string3(string3)
{};
template<class Archive>
void serialize(Archive & archive, const unsigned int version)
{
// When the class Archive corresponds to an output archive, the
// & operator is defined similar to <<. Likewise, when the class Archive
// is a type of input archive the & operator is defined similar to >>.
archive & this->string1;
archive & this->string2;
archive & this->string3;
}
std::string string1;
std::string string2;
std::string string3;
};
我的测试代码:
TestClass testClass;
std::string value("nonsense");
try
{
std::stringstream stringStream;
stringStream << value;
boost::archive::text_iarchive serializer(stringStream);
serializer >> testClass;
}
catch (const boost::archive::archive_exception& e)
{
....
}
执行此代码时,我收到了一个std::length_error:
在抛出'std::length_error'实例后终止调用
what(): basic_string::resize
这是Boost序列化器已知的(已记录的)行为吗?我可以对输入流进行检查以查看它是否有效,还是反序列化程序缺少try/catch处理?
问候,
约翰
string::resize
仅在有人试图使size()
大于max_size()
时才会抛出length_error
。这几乎是不可能的。 - Bo Persson