#c #serialization #io #cereal
Вопрос:
Я пытаюсь сериализовать класс в двоичный файл, для этого я сначала начал пытаться сериализовать std::string
элемент внутри класса, я написал этот метод сериализации:
template<typename Archive>
void ShaderProgram::serialize(Archiveamp; archive, ShaderProgramamp; program)
{
archive(CEREAL_NVP(program.program_name));
}
Затем я пытаюсь сериализовать и сразу же прочитать класс:
ShaderProgram program;
std::filesystem::create_directories(fs::path(cached_shader_path).parent_path());
std::ofstream os(cached_shader_path, std::ios::binary);
cereal::BinaryOutputArchive archive_out( os );
ShaderProgram::serialize(archive_out, program);
std::ifstream is(cached_shader_path, std::ios::binary);
cereal::BinaryInputArchive archive_in( is );
ShaderProgram::serialize(archive_in, program);
Что приводит к:
terminate called after throwing an instance of 'cereal::Exception'
what(): Failed to read 8 bytes from input stream! Read 0
Класс, с которым я это тестирую, тривиален:
struct ShaderProgram
{
std::string program_name = "name";
template<typename Archive>
static void serialize(Archiveamp; archive, ShaderProgramamp; program);
};
template<typename Archive>
void ShaderProgram::serialize(Archiveamp; archive, ShaderProgramamp; program)
{
archive(CEREAL_NVP(program.program_name));
}
Я не понимаю, почему это не удается.
Комментарии:
1. Одновременное чтение и запись в один и тот же файл может быть проблематичным. Здесь вы даже не сбросили сериализованные данные и ожидаете, что сможете их прочитать.
2. Как мне очистить данные?
3.
ofstream
имеет функциюflush
, которая делает именно это. Он также вызывается во время деструктора.