Повысьте сериализацию - Нет больше исключений archive_exception при десериализации поврежденных данных? - PullRequest
4 голосов
/ 04 августа 2011

Несколько месяцев назад я реализовал компонент, который получает данные через UDP-сеть, десериализует их с помощью Boost :: Serialization и начинает работать с входящими объектами.

После некоторого времени использования этого компонента происходят случайные сбои, которыеЯ мог бы решить, узнав, что кто-то еще отправляет данные на мой UDP-порт.

Я решил эту проблему, просто добавив попытку / ловушку вокруг десериализации:

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;
}

Вышекод сортировал любые посторонние / поврежденные данные, поступающие через сеть, и просто десериализировал данные, которые должны были быть.

Тогда я работал с более старой Boost-версией (я не очень хорошо знаю, 1,44, 1,42).?) на Linux-машине.

В настоящее время я должен снова использовать компонент на машине с Windows XP с довольно новым Boost 1.46.1.Теперь проблема в том, что try / catch больше не фильтрует внешние / поврежденные данные.Когда что-то из этого кода поступает, мое приложение падает без какого-либо сообщения об ошибке.

Я не могу изменить порт, который слушаю.Кроме того, я хочу создать надежное приложение, которое игнорирует данные, с которыми оно не может работать, вместо того, чтобы аварийно завершать работу.

Теперь мне интересно, есть ли у кого-нибудь идея, почему возникает этот эффект?Повышение становится менее крепким?Это что-то с ОС?Я понятия не имею и надеюсь, что на этот вопрос может ответить кто-то, кто «больше любит».

1 Ответ

1 голос
/ 04 августа 2011

Мой ответ не имеет прямого отношения к ускорению сериализации, но всегда полезно выполнить некоторую проверку входящих данных из сети, прежде чем вводить более глубокую логику.

Перед тем, как углубиться в сериализацию Boost, я предлагаю вам:

  1. Проверьте размер пакета UDP
  2. Если вы используете какой-то заголовок, сделайте некоторую проверку
  3. Что бы вам ни показалось подходящим, вы можете

и затем попытаться десериализовать пакет.Таким образом, вы можете отфильтровать сторонние пакеты самостоятельно вместо того, чтобы * полагаться на повышение.

...