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