【问题标题】:Boost Serialization - No archive_exception when deserializing corrupt data anymore?Boost Serialization - 反序列化损坏数据时不再出现archive_exception?
【发布时间】:2011-08-04 11:14:03
【问题描述】:

几个月前,我实现了一个组件,它通过 UDP 网络接收数据,通过 Boost::Serialization 对其进行反序列化并开始处理传入的对象。

使用此组件一段时间后发生随机崩溃,当我发现其他人正在向我的 UDP 端口发送数据时可以解决。

我通过简单地在反序列化周围添加一个 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?)。

目前我必须在装有相当新的 Boost 1.46.1 的 Windows XP 机器上再次使用该组件。 现在的问题是,try/catch 似乎不再过滤外部/损坏的数据。就该代码中的某些内容而言,我的应用程序崩溃而没有任何错误消息。

我无法更改正在收听的端口。除此之外,我还想创建一个健壮的应用程序,它会忽略无法使用的数据而不是崩溃。

我现在想知道是否有人知道为什么会出现这种效果? Boost 是否变得不那么强大了?这与操作系统有关吗?我不知道,希望这是一个“更喜欢 Boost”的人可以回答的问题。

【问题讨论】:

    标签: c++ serialization boost


    【解决方案1】:

    我的回答与提升序列化没有直接关系,但在进入更深层次的逻辑之前对来自网络的传入数据进行一些验证总是一个好主意。

    在深入研究 boost 序列化之前,我建议您:

    1. 检查 UDP 数据包的大小
    2. 如果您使用某种标头,请进行一些验证
    3. 任何适合你的情况

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

    【讨论】:

    • 你是对的。也许我应该在 Boost-data 前面添加我自己的标题。通过这种方式,我可以随数据发送某种散列、大小信息等,并确保一切按预期工作。
    • 这实际上不是我问题的正确答案,但它告诉了如何解决潜在问题。如果该问题有其他更适合的答案,我将更改“正确答案”标志。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 2011-09-21
    • 1970-01-01
    • 2017-07-23
    • 2021-05-29
    • 1970-01-01
    相关资源
    最近更新 更多