--- basic_binary_iarchive.ipp (revision 14) +++ basic_binary_iarchive.ipp (working copy) @@ -16,6 +16,8 @@ #if defined(BOOST_NO_STDC_NAMESPACE) namespace std{ using ::memcpy; + using ::strlen; + using ::size_t; } #endif @@ -48,7 +50,23 @@ basic_binary_iarchive::init(){ // read signature in an archive version independent manner std::string file_signature; - * this->This() >> file_signature; + try { + std::size_t l; + this->This()->load(l); + if(l == std::strlen(BOOST_ARCHIVE_SIGNATURE())) { + // borland de-allocator fixup + #if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101)) + if(NULL != file_signature.data()) + #endif + file_signature.resize(l); + // note breaking a rule here - could be a problem on some platform + if(0 < l) + this->This()->load_binary(&(*file_signature.begin()), l); + } + } + catch(archive_exception const &) { // catch stream_error archive exceptions + file_signature = ""; // will cause invalid_signature archive exception to be thrown below + } if(file_signature != BOOST_ARCHIVE_SIGNATURE()) boost::serialization::throw_exception( archive_exception(archive_exception::invalid_signature)