增强序列化-在反序列化损坏数据时不再出现archive_exception

Boost Serialization - No archive_exception when deserializing corrupt data anymore?

本文关键字:再出现 不再 archive exception 数据 序列化 反序列化 损坏 增强      更新时间:2023-10-16

几个月前,我实现了一个组件,它通过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序列化之前,我建议您:

  1. 检查UDP报文大小
  2. 如果你正在使用某种头信息,请进行验证
  3. 无论你的情况如何

,然后尝试反序列化数据包。这样,您可以自己过滤掉外部数据包,而不是*依赖的boost。