微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 std::istringstream 构建 boost::archive::text_iarchive 时出现未知异常

如何解决从 std::istringstream 构建 boost::archive::text_iarchive 时出现未知异常

我似乎在从 boost::archive::text_iarchive 构造 std::istringstream 时出错

#include <vector>
#include <string>
#include <thread>
#include <atomic>
#include <iostream>
#include <unordered_map>
#include <functional>
#include <sstream>

#include "boost/asio.hpp"
#include "boost/bind.hpp"
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>

int main() {


    std::vector<char> readBuffer_(8,'x');


    std::string archive_data(&readBuffer_[0],readBuffer_.size());
    std::istringstream archive_stream(archive_data);
    if (archive_stream) {
        std::cout << "functioning" << std::endl;
    }
    boost::archive::text_iarchive archive(archive_stream);
    std::cout << "woop" << std::endl;
}

可能是什么问题?

解决方法

由于输入数据 xxxxxxxx 反序列化是非法的,代码得到一个异常。

input_stream_error 的文档:

流输入或输出期间发生错误。除了 常见情况,例如损坏或截断的输入文件,有 有几个不太明显的有时会发生。这包括一个 尝试读取文件末尾。文本文件需要一个 在文件末尾终止换行符 在调用归档析构函数时附加。确保一个 在打开输入之前销毁流上的输出存档 存档在同一个流上。也就是说,而不是使用类似

您可以通过将输入字符串替换为有效的序列化内容来验证它:

#include <array>
#include <atomic>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <functional>
#include <iostream>
#include <sstream>
#include <string>
#include <thread>
#include <unordered_map>
#include <vector>

int main() {
  std::istringstream archive_stream(
      "22 serialization::archive 9 3 0 1 3 5 0 0 2 0 0 0 1 3 one 2 3 two");
  if (archive_stream) {
    std::cout << "functioning" << std::endl;
  }
  try {
    boost::archive::text_iarchive archive(archive_stream);
  } catch (const std::exception& e) {
    std::cout << "except hit:" << e.what() << std::endl;
  }
  std::cout << "woop" << std::endl;
}

A related question 查看 boost 序列化格式的详细信息。一般情况下,我们应该对boost实现结果生成的内容进行反序列化处理,避免出现此类错误。

添加我们应该捕获异常以使我们的程序健壮,有几个原因导致数据损坏和反序列化异常:

  • 磁盘数据损坏
  • 网络传输错误
  • 您系统的其他进程/模块存在错误

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。