Boost и целостность сериализации хлопьев

Я просмотрел документацию по Boost Serialization и библиотеке Cereal, но ничего конкретного не нашел. Мне интересно, можно ли проверить целостность сериализованных данных. Я не говорю об аспекте безопасности, но если по какой-либо причине сохраненный файл поврежден, загруженные данные могут быть совершенно неправильными. Поддерживается ли что-нибудь в этих библиотеках по этому аспекту? Я думал реализовать что-то подобное сам, но возникла проблема на этапе загрузки для обеих библиотек:

template<class Archive>
void load(Archive& ar) {
   //checksum here??
   ar >> mydata;
}

Чтобы вычислить контрольную сумму, мне нужно прочитать все данные. Однако для обеих библиотек я ничего не могу извлечь из архива, я могу просто заполнить атрибуты класса, надеясь, что все загружается без ошибок, и тогда я могу посчитать контрольную сумму. Я хотел бы рассчитать контрольную сумму, прежде чем загружать атрибуты класса. Является ли это возможным?


person greywolf82    schedule 07.03.2020    source источник


Ответы (1)


Я не знаю сериализации, которая делает это специально.

При необходимости иногда делается сериализация объекта, а затем этот поток байтов и его хеш становятся полями в другом промежуточном объекте, который также сериализуется. Этот последний поток байтов и есть то, что передается.

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

Это немного неэффективно — нужно сериализовать два объекта. Однако промежуточный объект в основном представляет собой просто поток байтов, и его сериализация часто может быть очень простой задачей (особенно для бинарных сериализаторов, таких как GPB).

Это также довольно часто не нужно. Такие вещи, как файловые системы, TCP и т. д., уже имеют встроенную проверку и исправление ошибок. Если ваш транспортный носитель уже имеет встроенную проверку целостности данных, ее добавление может оказаться излишним. Вы упомянули файловое хранилище — использование такой файловой системы, как ZFS, было бы отличным способом обеспечить целостность данных (плюс множество других преимуществ), уменьшая потребность в собственной проверке. Что бы вы ни делали, ZFS все равно будет применять исправление ошибок к сохраненным данным.

person bazza    schedule 08.03.2020