【发布时间】: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