12

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

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()); 
    } 
} 

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

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

ответ

15

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

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

+5

Обратите внимание, что это может существенно повлиять на производительность вашего приложения. –

9

подталкивание: архив :: binary_xarchive в настоящее время не портативный

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

3

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

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

+0

Ничего себе. Не уверен, что я когда-либо слышал «эффективно» и «ASN.1» так близко друг к другу раньше. Но потом мне пришлось отлаживать ASN.1, который написал кто-то другой, поэтому я склонен ассоциировать его с часами мучительной агонии. На самом деле не может быть ошибкой ASN.1. –

+0

Я не спорю. Это моя вина. Я должен был прочитать документы Boost.Serialization. Текст в порядке. –

+0

@Steve Jessop - Не ваша вина вообще, но я думаю, что это главным образом ошибка задачи. Вероятно, есть некоторые общие анализаторы ASN.1, но каждый из тех, что я когда-либо видел, просто анализирует подмножество ASN.1, которое он ожидает от того, кто другой. Даже это волосатая задача. –

7

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

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

+1

'eos_portable_archive' не поддерживает сериализацию wstrings, которые для меня нарушили сделку. Существует portable_binary_iarchive.hpp, который поставляется с boost (в boost/libs/serialization/example), который не имеет этого ограничения, и работал отлично для меня. У этого есть некоторые другие ограничения [документированные здесь] (http://www.boost.org/doc/libs/1_47_0/libs/serialization/doc/todo.html#portablebinaryarchives) –

+0

@Omer Raviv: портативный архив не поддерживает сериализуя типы с плавающей точкой, которые были нарушены для меня в этот момент. На самом деле я понял, что 'boost :: serialization' [добавляет ужасающий размер] (http://lists.boost.org/boost-users/2010/09/63015.php) к исполняемому файлу, который я его оставил и перевернул , Я не уверен, что исправлены новые версии boost. – kizzx2

+3

** ОБНОВЛЕНИЕ: ** Портативный архив EOS v5.0 теперь [поддерживает wstring] (http://epa.codeplex.com/releases/view/91073). Новый дом [здесь] (http://epa.codeplex.com/). –

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