2014-09-03 2 views
3

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

Проблема, с которой я сталкиваюсь, заключается в том, что если файл читается (по ошибке) не в правильном формате, программа вылетает (возможно, ожидается).

Как определить, что файл находится в неправильном формате и прервать процесс чтения до сбоя программы?

EDIT:

Я попытался попробовать поймать построить в моем чтении в функции, которая выглядит следующим образом

int read_binary(file_in_out* object){ 

    std::ifstream ifs((*object).file.c_str()); 

    try 
    { 
     boost::archive::binary_iarchive ia(ifs); 
     ia >> (*object).content; 


    } 
    catch (boost::archive::archive_exception& ex) 
    { 
     std::cout << "An exception occurred. Exception Nr. " << '\n'; 
     return 1; 
    } 
    catch (int e) 
    { 
     std::cout << "An exception occurred. Exception Nr. " << e << '\n'; 
     return 1; 
    } 

    return 0; 

} 

Это ловит исключение, если файл не имеет ничего общего со структурами, которые его пытается прочесть в нем. Однако, когда я использую устаревшую версию, она не вызывает исключения и сбой в строке 'ia >> (* object) .content;' Есть идеи?

ответ

1

Не должно быть аварии. Если да, сообщите об ошибке с разработчиками библиотеки.

Это должно сделать исключение. Таким образом, вы могли бы попытаться поймать архивные исключения:

http://www.boost.org/doc/libs/1_36_0/libs/serialization/doc/exceptions.html

unregistered_class,  // attempt to serialize a pointer of an 
          // an unregistered class 
    invalid_signature,  // first line of archive does not contain 
          // expected string 
    unsupported_version, // archive created with library version subsequent 
          // to this one 
    pointer_conflict  // an attempt has been made to directly serialize 
          // an object after having already serialized the same 
          // object through a pointer. Were this permitted, 
          // it the archive load would result in the creation 
          // of extraneous object. 
    incompatible_native_format, // attempt to read native binary format 
          // on incompatible platform 
    array_size_too_short, // array being loaded doesn't fit in array allocated 
    stream_error   // i/o error on stream 
    invalid_class_name,  // class name greater than the maximum permitted. 
          // most likely a corrupted archive or an attempt 
          // to insert virus via buffer overrun method. 
    unregistered_cast  // base - derived relationship not registered with 
          // void_cast_register 

Кроме того, улов std::exception& для например bad_alloc, и т. Д.

+1

Это неизбежно произойдет, если файл находится в двоичном формате, а структурированная программа не соответствует структурам, которые хранятся (если не считать версии и не приняты меры предосторожности). –

+1

@ DieterLücking Я считаю несправедливым сказать, что «он неизбежно потерпит крах». Существует санитария для ввода и хорошо применяется для двоичного ввода. Это просто требует внимания к деталям. Я не уверен в встроенном материале, но я полностью ожидаю 'std :: bad_alloc', например. когда вы ошибочно резервируете для огромного вектора и красивое исключение архива или 'std :: basic_istream :: failure', если вы достигли неожиданного конца файла, пропавших разделителей, поврежденных кодов типов ... – sehe

+0

Попытка try/catch для исключений (см. править), но без радости ... – user3353819

Смежные вопросы