stl — Невозможно сериализовать и десериализовать стек строк в Qt / Stack Overflow

У меня есть приложение, в котором мне нужно сохранить некоторые данные, поэтому я подумал о сериализации объектов. Я нашел хороший пример Вот. Следуя этому, вот что я придумал:

    std::stack <std::string> cards;
cards.push("King of Hearts");
std::ofstream ofs("<location>", std::ios::binary);
ofs.write((char *)&cards, sizeof(cards));
ofs.close();

Затем я пытаюсь прочитать данные:

    std::stack<std::string> inp;
std::ifstream ifs("<same_location>", std::ios::binary);
ifs.read((char *)&inp, sizeof(inp));

Однако в последней строке происходит сбой приложения (по какой-то причине из-за моих настроек Qt я не могу отладить в данный момент). В чем может быть возможная ошибка, и как мне это исправить?

0

Решение

Краткий ответ: вы не можете сериализовать стек так же, как описано в статье. Я бы сказал, что вы можете сериализовать POD только таким способом. Проблема здесь в том, что данные, которые вы хотите записать, не хранятся постоянно в памяти и с помощью ofs.write((char *)&cards, sizeof(cards)); Вы не принимаете во внимание указатели на другие места в памяти.

Попробуйте этот эксперимент: почему размер (карточки) не меняется, когда вы добавляете в него все больше и больше данных?

0

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

  1. Ваша проблема в том, что вы принимаете свойства стека, которые не соответствуют действительности. std :: stack по умолчанию использует deque в качестве структуры поддержки, поэтому элементы не смежный в памяти.
  2. Вы никогда не должны предполагать, что структуры данных, которыми вы не владеете, безопасны для произвольной сериализации. В C ++ предпочтительной парадигмой является использование >> и << Операторы потока, как преобразования могут иметь место.
  3. sizeof () получает только размер объекта в памяти, а не размер указателей на данные. sizeof () для получения количества элементов в контейнере приведет к бесполезным значениям.

Чтобы исправить эти проблемы, вы должны написать свои собственные операторы потока для сериализации в макете, который, как вы знаете, находится под вашим контролем.

0

По вопросам рекламы [email protected]