Сериализация строк в C ++ - PullRequest
0 голосов
/ 27 мая 2020

У меня есть следующие поля класса:

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 был поврежден». Отладчик показывает, что все поля были десериализованы правильно, кроме строкового поля. Итак, как правильно сериализовать / десериализовать строку?

1 Ответ

4 голосов
/ 27 мая 2020

In Deserialize

ifs.read((char*)& stringSize, sizeof(string));

должно быть

ifs.read((char*)& stringSize, sizeof(int));

Однако обратите внимание, что компилятор / порядок байтов / et c должен быть таким же, когда вы сериализуете и десериализуйте, почему вы не используете стандартное внешнее представление числа / строки / ...?

Обратите внимание, что по определению sizeof(char) равно 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...