Boost.Serialization , вероятно, лучший вариант для этого в C ++. Если вы хотите сохранить двоичные данные, вам нужно создать boost::archive::binary_oarchive
и связать его с вашим файлом:
std::ofstream ofs("my_file.dat");
boost::archive::binary_oarchive oarch(ofs);
Любой класс, который вы хотите сериализовать, должен иметь функцию-член serialize
со специальной подписью, понятной библиотеке. Например:
class Foo
{
int i;
Baz baz;
template<class Archive>
void serialize(Archive &ar, unsigned int version) {
ar & i;
ar & baz; // Baz must be serializable
}
};
Обратите внимание, что есть встроенная поддержка управления версиями, но это более сложная тема.
Сохранение объектов вашего класса в бинарный архив очень просто:
Foo foo;
oarch << foo; // Serializes "foo"
Крутая вещь в Boost.Serialization заключается в том, что та же функция-член используется для десериализации объекта. Разница лишь в том, что теперь вы используете входной архив:
std::ifstream ifs("my_file.dat");
boost::archive::binary_iarchive iarch(ofs);
Foo foo;
iarch >> foo; // Deserializes "foo"
Что касается шифрования, то библиотека Botan выглядит довольно зрелой, и ее C ++ отличается от OpenSSL тем, что она C и поэтому немного болезненна для использования.
Вот как я думаю, вы можете выполнять сериализацию + шифрование в одном и том же рабочем процессе (десериализация будет аналогичной):
Вы связываете свой архив со строкой в памяти, а не с файлом:
std::ostringstream oss;
boost::archive::binary_oarchive oarch(oss);
Все, что вы пишете в архив, будет храниться в строке.
Вы сериализуете свои объекты так же, как и раньше:
Foo foo;
oarch << foo; // Serializes "foo" (data goes to the string)
Вы используете библиотеку Botan для шифрования вашей строки. Не воспринимайте это слишком буквально, но это должно быть что-то вроде:
a) создать источник данных памяти Botan, связанный с вашей строкой (объект oss
).
b) создать приемник данных Botan, связанный с файлом, в который вы хотите записать ("myfile.dat").
c) создать кодировщик, который соответствует вашим потребностям
d) вызвать функцию кодирования, как в encode(source, sink);
РЕДАКТИРОВАТЬ: Изменено крипторекомендации с OpenSSL на Botan.