提升序列化会引发std异常

时间:2012-03-13 09:59:45

标签: c++ boost boost-serialization

在测试一些使用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?

的问候,
    约翰

1 个答案:

答案 0 :(得分:0)

您正在编写一个字符串并阅读您的TestClass。

你的行

archive & this->string2;

已经尝试从未初始化的内存中读取。这意味着,您可能尝试分配一个太大的std :: string(50%的时间,每次都很可能有两个字符串)。

因此,异常来自您的代码,并且从归档程序中捕获并不奇怪。