在测试一些使用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?
的问候,
约翰
答案 0 :(得分:0)
您正在编写一个字符串并阅读您的TestClass。
你的行
archive & this->string2;
已经尝试从未初始化的内存中读取。这意味着,您可能尝试分配一个太大的std :: string(50%的时间,每次都很可能有两个字符串)。
因此,异常来自您的代码,并且从归档程序中捕获并不奇怪。