LINUX.ORG.RU

boost serialization set Max version

 ,


0

5

Сериализирую объекты бустом приблизительно так.

    std::ostringstream oss;
    boost::archive::text_oarchive toa(oss);
    toa << obj;

    toa.save_binary(&buff.at(0), buff.size());
  

    outStr = oss.str();

Другой метод десириализирует.

Запускаю на разных версиях linux с разными boost, где стоят разные версии boost и возникает исключение при десиализации: «unsupported version».

Cобираю на cubieTrack (boost 1.58; версия сериализатора: 12), gentoo (boost 1.56; версия сериализатора: 11),
orangepi (boost 1.54, версия сериализатора: 10).


Вопрос: можно ли задать максимальную версию сериализатора? Желательно в рантайме, но также подойдет и в компайлТайме.

Собирать boost нет желание

★★★★

Если ты переносишь данные между машинами, то лучше вообще не использовать boost Serialization, т.к. он не умеет создавать независимые от архитектуры бинарные архивы. Вот хорошая альтернатива: http://uscilab.github.io/cereal/

asaw ★★★★★
()
Последнее исправление: asaw (всего исправлений: 1)
Ответ на: комментарий от asaw

А почему могут быть проблемы? Я сериализирую изображение с вебкамеры. OpenCV вычитывает, если клиет подключен - другой поток сериализирует и отправляет (используя boost asio) клиенту.

С orangepi (ubuntu, версия не помню, boost 1.54, версия сериализатора: 10) к gentoo и к ubunta (16.04, boost 1.58) работает.
Возможно из-за порядка байт?

ymuv ★★★★
() автор топика
Последнее исправление: ymuv (всего исправлений: 2)
Ответ на: комментарий от ymuv

А почему могут быть проблемы? Я сериализирую изображение с вебкамеры.

В общем случае - из-за порядка байт и из-за размеров типов данных (помнится, наступил именно на эти грабли с бустовой сериализацией при пересылке данных между виндой и линуксом на машинах с amd64 и i586 архитектурами, после чего её и выкинул). А тут ты меня вообще сразил наповал: сериализовывать изображение с веб-камеры бустом - это сильно. Но даже если согласиться, что это нормально, то всё равно Cereal лучше, ибо гораздо быстрее.

asaw ★★★★★
()
Последнее исправление: asaw (всего исправлений: 1)

boost serialization - кусок говна именно из-за непостоянности формата между версиями. Потому выкидывай его нафиг и меняй на что-то нормальное.

З.Ы. protobuf хорош, но имеет некоторые проблемы с производительностью.

Pavval ★★★★★
()
Ответ на: комментарий от asaw

Там не только изображение, а и другая информация. Взял его, так как встречался с им.

Я там сохраняю std::string, int, void *.

ymuv ★★★★
() автор топика
Ответ на: комментарий от ymuv

Я уже сказал - boost serialization сжечь нахер. Он с нестабильным ABI просто неюзабелен. На этом вопрос по бусту закрыли. Остаются или другие либы, или руками.

Pavval ★★★★★
()
Ответ на: комментарий от Pavval

Глупый вопрос. Будет ли это платформонезависимым?

int i; 
std::string str;

std::stringstream stream;
stream << i << " ";
stream << str.size() << " " << str;
return stream.str();


Клиент будет разбирать строку в том же порядке.

ymuv ★★★★
() автор топика
Последнее исправление: ymuv (всего исправлений: 1)
Ответ на: комментарий от ymuv

_если_ ты точно знаешь, что всё, что тебе надо - это всего int + string + blob, то пишешь говнокодом в лоб, используя платформенно-независимые типы:


std::string str = ...;
int32_t i = ...;
std::vector<char> buf = ...;

size_t size = sizeof(uint64_t) + str.size() + sizeof(i) + sizeof(uint64_t) + buf.size();

std::unique_ptr<char> data(new char[size]);
char* ptr = data.get();

memcpy(ptr, static_cast<uint64_t>(str.size()), sizeof(uint64_t));
ptr += sizeof(uint64_t);
memcpy(ptr, str.c_str(), str.size());
ptr += str.size();

memcpy(ptr, i, sizeof(i));
ptr += sizeof(i);

memcpy(ptr, static_cast<uint64_t>(buf.size()), sizeof(uint64_t));
ptr += sizeof(uint64_t);
memcpy(ptr, &buf[0], buf.size());
ptr += buf.size();

writefile(data.get(), size);

На endianness забиваешь, пока реально в твоей жизни не появится полумертвая платформа, где endianness другой. Да и buf небось у тебя тоже зависит от endianness.

Этот говнокод лучше чем тормозной stringstream за счет минимального кол-ва аллокаций памяти/копирования.

Pavval ★★★★★
()
Последнее исправление: Pavval (всего исправлений: 2)
Ответ на: комментарий от Pavval

std::unique_ptr<char> data(new char[size]);

Надо char[]: std::unique_ptr<char[]> data(new char[size]);

Или: auto data = std::make_unique<char[]>(size);

На endianness забиваешь, пока реально в твоей жизни не появится полумертвая платформа, где endianness другой. Да и buf небось у тебя тоже зависит от endianness.

Так человек же про OrangePi написал, а разве там не ARM с BigEndian?

eao197 ★★★★★
()
Последнее исправление: eao197 (всего исправлений: 1)
Ответ на: комментарий от eao197

Так человек же про OrangePi написал

Опа, пропустил мимо ушей.

а разве там не ARM с BigEndian?

А хз.

Pavval ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.