增强序列化-在反序列化损坏数据时不再出现archive_exception
Boost Serialization - No archive_exception when deserializing corrupt data anymore?
几个月前,我实现了一个组件,它通过udp网络接收数据,通过Boost::Serialization对其进行反序列化,并开始处理传入的对象。
使用此组件一段时间后,随机崩溃发生,我可以解决时,发现别人正在发送数据到我的UDP-Port。
我通过简单地在反序列化周围添加try/catch来解决这个问题:try
{
boost::archive::text_iarchive inputArchive(incomingData);
inputArchive >> givenElements; //the actual deserialization, here the exception has been thrown in the past
}
catch( boost::archive::archive_exception& ex )
{
std::cout << "Archive Exception during deserializing:" << std::endl;
std::cout << ex.what() << std::endl;
std::cout << "Incoming data had the following content:" << std::endl;
std::cout << dataStream.str() << std::endl;
}
上面的代码整理了通过网络传入的任何外来/损坏的数据,并且只是对数据进行了反序列化。
那时我在linux机器上使用一个更老的boost版本(我不太了解,1.44,1.42?)。
目前,我必须在Windows XP机器上使用相当新的Boost 1.46.1再次使用该组件。现在的问题是,try/catch似乎不再过滤外来/损坏的数据了。只要有代码传入,我的应用程序就会崩溃,没有任何错误消息。
我不可能改变我正在收听的端口。除此之外,我想创建一个健壮的应用程序,忽略它不能工作的数据,而不是崩溃。
我现在想知道是否有人知道为什么会发生这种效应?Boost是不是变得不那么强劲了?这是操作系统的问题吗?我不知道,希望这是一个"更喜欢Boost"的人可以回答的问题。
我的回答与boost序列化没有直接关系,但是在进入更深层次的逻辑之前,对来自网络的传入数据进行一些验证总是一个好主意。
在深入研究boost序列化之前,我建议您:
- 检查UDP报文大小
- 如果你正在使用某种头信息,请进行验证
- 无论你的情况如何
,然后尝试反序列化数据包。这样,您可以自己过滤掉外部数据包,而不是*依赖的boost。
相关文章:
- 为"adjacent"变量赋值时出现问题
- 在Ubuntu 16.04上安装Cilk时出现问题
- 代码在main()中运行,但在函数中出现错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 在某些循环内使用vector.push_back时出现分段错误
- C++中的赋值发生,尽管右侧出现异常
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 我想做一个彼此不同但重复出现的数字
- 运行程序时出现问题
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- malloc() 可能出现内存泄漏
- 当我的阵列太大时出现分段错误
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- 第一次执行后我的while循环周围出现错误,不再要求输入
- 增强序列化-在反序列化损坏数据时不再出现archive_exception