Обновление совместимости ускоренной сериализации с двоичными архивами armv7 до arm64

Компания, в которой я работаю над выпусками для iOS и Android, и теперь Apple требует, чтобы мы обновили все наши приложения для работы на архитектуре arm64 (ранее мы выпускали только для armv7). К сожалению, мы использовали boost::archive::binary_iarchiveх (и binary_oarchives) для хранения большого количества пользовательских данных (сохраненные игры, настройки и т. д.).

Во время тестирования загрузка этих архивов, которые были сохранены в двоичном файле armv7, теперь безуспешно завершается на устройствах arm64, работающих под управлением «Universal Binary» версии наших игр.

template<typename T>
static T Deserialize(std::vector<char> buffer) {
boost::iostreams::basic_array_source<char> source(&buffer[0], buffer.size());
boost::iostreams::stream<boost::iostreams::basic_array_source<char>> input_stream(source);
boost::archive::binary_iarchive ia(input_stream); // crashes here
T value;
ia >> BOOST_SERIALIZATION_NVP(value);
return value;
}

Буфер, который мы передаем, имеет разумный размер. Исходя из того, что он падает во время конструктора boost::archive::binary_iarchive Я предполагаю, что он не может правильно прочитать заголовок.

Это ошибка, которая регистрируется:

(2005,0x19a1c0310) malloc: *** mach_vm_map(size=7598247065923108864) failed (error code=3)
*** error: can't allocate region

Есть ли способ, которым мы можем обновить, а также сохранить пользовательские данные?

3

Решение

Если вам нужно сохранить данные пользователя, вам придется перепроектировать свой выход из ада. Вы можете обмануть, отправив старые данные на сервер для преобразования.

Для портативных архивов вы можете попробовать OES Портативный Архив реализация.

Предполагается, что он станет заменой стандартных двоичных архивов и призван быть по-настоящему переносимым. Конечно, результаты не будут бинарно совместимы со старым форматом, так что это просто решение в будущем.

1

Другие решения