Кажется, что злаки неправильно сериализуют строку std::

#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 , которая делает именно это. Он также вызывается во время деструктора.