Подтвердить что ты не робот

Разрабатывает ли Boost.Serialization по-разному на разных платформах?

Я использую Boost.Serialization для сериализации std:: map. Код выглядит следующим образом:

void Dictionary::serialize(std::string & buffer)
{
  try {
    std::stringstream ss;
    boost::archive::binary_oarchive archive(ss);
    archive << dict_; 
    buffer = ss.str();
  } catch (const std::exception & ex) {
    throw DictionaryException(ex.what());
  }
}

void Dictionary::deserialize(const char * const data, int length)
{
  try {
    namespace io = boost::iostreams;
    io::array_source source(data, length);
    io::stream<io::array_source> in(source);
    boost::archive::binary_iarchive archive(in);
    archive >> dict_;
  } catch (const std::exception & ex) {
    throw DictionaryException(ex.what());
  }
}

Я скомпилировал и протестировал код на Mac Snow Leopard и на Ubuntu Lucid 10.04. В обеих системах есть Boost 1.40. На Mac я сам сам построил код. В поле Ubuntu я получил двоичные файлы через aptitude.

Проблема: когда я сериализую карту на Mac, я не могу десериализовать ее в поле Ubuntu. Я получаю исключение недопустимой подписи, если попытаюсь.

4b9b3361

Ответ 1

попробуйте использовать text_iarchive и text_oarchive вместо двоичных архивов. Из документа

В этом учебнике мы использовали особый класс архива - text_oarchive для сохранения и text_iarchive для загрузки. текст архивы предоставляют данные как текст и являются переносимый на разных платформах. К тому же в текстовые архивы, в библиотеку входят класс архива для собственных двоичных данных и форматированные XML-данные. Интерфейсы для все классы архива идентичны. После определения сериализации для класса этот класс может быть сериализован для любого типа архива.

Ответ 2

boost: archive:: binary_xarchive в настоящее время не переносится

С моей интерпретацией это означает, что на разных платформах могут быть различия. Текстовые архивы дают одинаковое поведение ввода/вывода для всех систем.
Также есть связанная запись TODO, которая пытается решить проблему переносимости двоичных архивов: TODO Entry

Ответ 3

Производительность с text_archives - это величины медленнее, чем binary_archive. Если производительность ваша, вы можете попробовать неофициальный переносимый двоичный архив eos_portable_archive. Я использовал его для успешной сериализации данных в 32-битных и 64-битных версиях Windows. Вы можете уйти.

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

Ответ 4

Я согласен с ответами, но хотел добавить пояснительную записку. Вы можете подумать, что это раздражающий надзор, но на самом деле разработка и реализация портативного двоичного формата - не такая тривиальная задача. Единственный стандарт, который я знаю об этом, эффективно решает проблему в двоичном формате: ASN.1.

XML обрабатывает одну и ту же проблему, но обычно делает это в тексте. Там есть стандарт контрейлерных технологий для XML, называемый Fast Infoset, который позволяет XML кодировать данные в двоичной форме, но использует ASN.1.