c++ - 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' 周围的堆栈已损坏。” 调试器显示,所有字段都被正确反序列化,期望字符串字段。那么,如何正确序列化/反序列化字符串呢?
解决方案
在反序列化
ifs.read((char*)& stringSize, sizeof(string));
一定是
ifs.read((char*)& stringSize, sizeof(int));
但是请注意,序列化和反序列化时编译器/字节顺序/等必须相同,为什么不使用数字/字符串/...的标准外部表示?
还要注意按定义sizeof(char)
是 1
推荐阅读
- azure-pipelines-yaml - 从 YAML 管道任务覆盖 DotNet Core 测试运行参数
- android - 如何设置 socks4 代理 android webview?
- authentication - 检查用户是否使用 VBScript 登录您的工作站
- php - 获取带有图像形式 facebook 页面的 facebook 帖子
- google-cloud-platform - 恢复后 GCP 云功能不起作用 从暂停
- ruby-on-rails - 如何通过 Heroku 安装 Spree 商务扩展?
- javascript - setState 不会在地图函数内呈现文本字段
- javascript - JavaScript 字符串 08-24-2021 转换为日期在 Firefox 和 safari 中失败,但在 chrome 中有效
- apache-kafka - @KafkaListener 在 consumer.resume 之后没有轮询消息
- eggplant - Egglpant 停止测试用例