Обратная совместимость векторной (де) сериализации с Boost.serialization - PullRequest
6 голосов
/ 29 ноября 2011

Извините за перекрестную публикацию.После публикации в рассылке boost-users и одной недели без каких-либо ответов я склонен опубликовать проблему в stackoverflow.Исходное сообщение, слегка отредактированное:

Привет список,

Я перехожу с Boost v1.35 на новую версию.Однако у меня есть некоторые унаследованные сериализованные строки, которые я хочу, чтобы они были доступны для чтения новой версией.

После некоторого тестирования я обнаружил, что, по-видимому, более новая версия (в данном случае 1.40, но и позже) не может правильно десериализовать std:: векторные экземпляры из 1,35 сгенерированных строк.Кто-нибудь может дать мне указатель на то, в чем может быть проблема здесь?

Большое спасибо!

Эвальд

== Подробности ==

Iиспользуйте текстовые архивы и gcc версии 4.4.1 (Ubuntu 4.4.1-4ubuntu9)

Тестовый вектор - это структура с 2 элементами, длинными целыми числами 1 и 2.

Строка архива длясоответствующие версии библиотеки:

1,35: archive: 22 serialization::archive 4 2 1 2
1,40: archive: 22 serialization::archive 5 2 0 1 2

Сейчас:

// includes
#include <boost/serialization/vector.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>

std::vector<long> testvector;
std::string val = "22 serialization::archive 4 2 1 2"; // v1.35 archive
{
std::stringstream ss(std::stringstream::in | std::stringstream::out);
ss << val << std::endl;
boost::archive::text_iarchive ia(ss);
ia >> BOOST_SERIALIZATION_NVP(testvector);
}

Результат при выполнении с библиотекой v1.40: testvectorсодержит два элемента, {2, 2} - вместо {1, 2}

Примечание: s11n и de-s11n с одинаковой версией lib работают отлично.

1 Ответ

1 голос
/ 23 марта 2012

Существует файл boost/serialization/vector_135.hpp, по крайней мере, в Boost 1.48 с этим комментарием:

vector_135.hpp: сериализация для векторных шаблонов stl для совместимости с выпуском 1.35, в котором была ошибка

Полагаю, вы могли бы включить его вместо boost/serialization/vector.hpp.Недостатком, конечно же, является то, что в этом случае вновь сериализованные векторы будут в том же ошибочном формате.Если файл используется, load() сможет десериализовать оба формата, но save() будет сериализован в новом формате.Таким образом, единственным недостатком, по-видимому, является уродливое включение имени.

...