Сериализация Boost.Serialization по-разному на разных платформах? - PullRequest
13 голосов
/ 14 сентября 2010

Я использую 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.Я получаю исключение неверная подпись , если я попытаюсь.

Ответы [ 4 ]

16 голосов
/ 14 сентября 2010

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

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

9 голосов
/ 14 сентября 2010

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

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

7 голосов
/ 14 сентября 2010

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

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

3 голосов
/ 14 сентября 2010

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

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

...