【发布时间】:2021-07-12 17:26:41
【问题描述】:
我需要序列化一个无序的地图。下面的方法使用fstream以二进制方式将数据读写到map中。但是,在清除地图并将其重新加载后,它会打印0 而不是5。当修改为与vector 而非unordered_map 一起使用时,这些函数可以正常工作。
#include <iostream>
#include <unordered_map>
#include <fstream>
using namespace std;
void saveData(unordered_map<int, int>* p_map_ptr) {
fstream file("data.bin", ios::out | ios::binary);
file.seekp(0);
file.write((char*) p_map_ptr, sizeof(*p_map_ptr));
file.close();
}
void loadData(unordered_map<int, int>* p_map_ptr) {
fstream file("data.bin", ios::in | ios::binary);
file.seekg(0);
file.read((char*) p_map_ptr, sizeof(*p_map_ptr));
file.close();
}
int main() {
unordered_map<int, int> map;
map[0] = 5;
saveData(&map);
map.clear();
loadData(&map);
cout << map[0];
}
【问题讨论】:
-
您实际上是在序列化地图对象本身的二进制表示。首先,这是未定义的行为;第二,这行不通。你需要序列化地图的内容——它的元素。如果您不想自己手动执行此操作,请使用一些序列化库(IIRC,Boost.Serialization 应该能够序列化标准库容器)。
-
简单地将某些对象的二进制表示写入文件严格来说没有序列化。序列化是以允许稍后恢复对象的形式写入对象的行为。当对象包含指针(
unordered_map肯定包含)时,您不能存储指针的地址,然后以有意义的方式从该地址恢复对象的状态 -
如果您想编写自己的数据序列化,请阅读常见问题解答isocpp.org/wiki/faq/serialization,因为它远非小问题。
标签: c++ file serialization file-io io