У меня есть следующие поля класса:
int _number;
string _name;
int _amount;
bool _isAvailable;
double _price;
int _storageTime;
int _entranceDay;
int _entranceMonth;
int _entranceYear;
Как мне сериализовать / десериализовать объект этого класса?
Я пробовал это:
void Serialize() {
ofstream ofs("tmp.bin", ios::binary | ios::out);
ofs.write((char*)& _number, sizeof(int));
ofs.write((char*)& _amount, sizeof(int));
ofs.write((char*)& _isAvailable, sizeof(bool));
ofs.write((char*)& _price, sizeof(double));
ofs.write((char*)& _storageTime, sizeof(int));
ofs.write((char*)& _entranceDay, sizeof(int));
ofs.write((char*)& _entranceMonth, sizeof(int));
ofs.write((char*)& _entranceYear, sizeof(int));
int stringSize = _name.size();
ofs.write((char*)& stringSize, sizeof(int));
for (int i = 0; i < stringSize; ++i) {
char c = _name[i];
ofs.write(&c, sizeof(char));
}
ofs.close();
}
И это для десериализации:
void Deserialize() {
ifstream ifs("tmp.bin", ios::binary | ios::in);
ifs.read((char*)& _number, sizeof(int));
ifs.read((char*)& _amount, sizeof(int));
ifs.read((char*)& _isAvailable, sizeof(bool));
ifs.read((char*)& _price, sizeof(double));
ifs.read((char*)& _storageTime, sizeof(int));
ifs.read((char*)& _entranceDay, sizeof(int));
ifs.read((char*)& _entranceMonth, sizeof(int));
ifs.read((char*)& _entranceYear, sizeof(int));
int stringSize;
ifs.read((char*)& stringSize, sizeof(string));
string name;
for (int i = 0; i < stringSize; ++i) {
char c;
ifs.read(&c, sizeof(char));
name += c;
}
_name = name;
ifs.close();
}
Сериализация не вызывает никаких исключений. Что касается десериализации - она выдает исключение: «Ошибка проверки времени выполнения №2 - стек вокруг переменной ifs был поврежден». Отладчик показывает, что все поля были десериализованы правильно, кроме строкового поля. Итак, как правильно сериализовать / десериализовать строку?