【发布时间】:2021-05-03 06:13:02
【问题描述】:
我正在使用 boost 序列化,并且我编写了一个自定义输入存档,它源自 boost 的二进制输入存档。事件虽然这个类现在与 boost 的 binary_iarchive 完全相同,但在反序列化基本类型的 std::vectors 时,我得到了 boost::archive::archive_exception。我没有遇到任何序列化问题,例如std::string 或 std::vector<std::string>。
这里是完整的代码:
InputArchive 实现:
#ifndef __INPUT_ARCHIVE_H
#define __INPUT_ARCHIVE_H
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/impl/basic_binary_iprimitive.ipp>
#include <boost/archive/impl/basic_binary_iarchive.ipp>
class InputArchive;
using iarchive = boost::archive::binary_iarchive_impl<
InputArchive,
std::istream::char_type,
std::istream::traits_type>;
class InputArchive : public iarchive {
friend class boost::archive::detail::interface_iarchive<InputArchive>;
friend class boost::archive::basic_binary_iarchive<InputArchive>;
friend class boost::archive::load_access;
public:
template<typename ... Args>
InputArchive(Args&& ... args)
: iarchive(std::forward<Args>(args)..., boost::archive::archive_flags::no_header)
{}
};
#endif
虚拟类,用于测试目的:
#ifndef __DUMMY_PRODUCT_H
#define __DUMMY_PRODUCT_H
#include <vector>
#include <boost/serialization/vector.hpp>
#include <string>
#include <boost/serialization/string.hpp>
struct dummy_product {
std::vector<char> data;
template<typename A>
void serialize(A& ar, const unsigned int version) {
ar & data;
}
};
#endif
以及使用存档的示例代码:
#include <boost/archive/binary_oarchive.hpp>
#include "InputArchive.hpp"
#include "DummyProduct.hpp"
#include <string>
#include <sstream>
#include <iostream>
int main() {
dummy_product p;
p.data.resize(16);
std::string buffer;
{
std::stringstream ss_value;
boost::archive::binary_oarchive oa(ss_value, boost::archive::archive_flags::no_header);
oa << p;
buffer = ss_value.str();
}
for(auto i : buffer) {
std::cout << (int)i << " ";
}
std::cout << std::endl;
{
std::stringstream ss_value(buffer);
//boost::archive::binary_iarchive ia(ss_value, boost::archive::archive_flags::no_header);
InputArchive ia(ss_value);
ia >> p;
}
}
此代码引发以下异常:
terminate called after throwing an instance of 'boost::archive::archive_exception'
what(): input stream error
如您所见,InputArchive 只是从适当的boost::archive::binary_iarchive_impl 继承而来,仅此而已。如果我将 InputArchive 替换为 boost::archive::binary_iarchive,则没有问题。如果我在dummy_product 中使用std::string 而不是std::vector<char> 也没有问题。异常似乎只发生在原始类型的std::vector。
知道这个问题是从哪里来的吗? 我正在使用 boost 1.75.0 和 gcc 8.3.0。
【问题讨论】:
标签: c++ serialization boost