如何解决从 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 举报,一经查实,本站将立刻删除。