首页 > 解决方案 > C++中的字符串序列化

问题描述

我有以下类字段:

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' 周围的堆栈已损坏。” 调试器显示,所有字段都被正确反序列化,期望字符串字段。那么,如何正确序列化/反序列化字符串呢?

标签: c++stringfileserializationbinary

解决方案


在反序列化

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

一定是

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

但是请注意,序列化和反序列化时编译器/字节顺序/等必须相同,为什么不使用数字/字符串/...的标准外部表示?

还要注意按定义sizeof(char)是 1


推荐阅读