从std :: fstream反序列化

时间:2011-11-02 10:32:15

标签: c++ serialization fstream

使用类似的东西从文件中读取序列化数据(已知格式+字节序)是否有什么特别糟糕或天真的东西?我并不担心可移植性,而且实际上它只会被我使用。我知道有一个问题是尝试提取到非打包的POD结构,尽管我总是可以为每个这样的结构定义一个单独的operator>

template<typename T> inline std::fstream& operator> (std::fstream& fs, T& i) {
    static_assert(std::is_pod<T>::value, "Not POD");
    fs.read(reinterpret_cast<char*>(&i), sizeof i);
    return fs;
}
template<typename T> inline std::fstream& operator> (std::fstream& fs, std::vector<T>& v) {
    static_assert(std::is_pod<T>::value, "Not POD");
    fs.read(reinterpret_cast<char*>(&v[0]), sizeof(T) * v.size());
    return fs;
}
template<typename T> inline std::fstream& operator> (std::fstream& fs, std::vector<std::vector<T>>& v) {
    for (auto& i : v)
        fs > i;
    return fs;
}
inline std::fstream& operator> (std::fstream& fs, std::string& s) {     
    fs.read(reinterpret_cast<char*>(&s[0]), s.size());
    return fs;
}

std::fstream f("file", std::ifstream::in | std::ifstream::out | std::ifstream::binary);
int i;
char j;
std::vector<std::vector<char>> vec(5, std::vector<char>(8));

f > i > j > vec;

1 个答案:

答案 0 :(得分:2)

我不确定你在问什么。您发布的代码无法阅读 序列化数据“已知格式或字节序”。它从中复制字节 文件到哪里,可能导致未定义的行为,是 除非通过一些奇怪的位,否则不太可能产生正确的值 幸运的是,“已知格式”完全对应于内部使用的格式 在你的机器上。我很多情况下,事实上,它可能会导致 程序崩溃;想想如果结构你可能会发生什么 例如,尝试读取包含指针。

我可能会补充说重载'&gt;'因为这是可怕的超负荷滥用;如果 你想要阅读一种特殊的格式,理所当然的就是去做 定义一个相应的类(例如ixdrstream)和重载 '&GT;&GT;'为了它。 (ixdrstream可能来自 std::basic_ios<char>,当然,几乎肯定会使用 标准streambuf用于实际输入。)

当然,你永远不会在std::fstream上过载,而是在过载 std::istream(或std::ostream输出)。 (FWIW,我不认为 我曾用过std::fstream。流成语真的没有 支持优雅地混合读写。)