C++ 从std::fstream进行非序列化

C++ 从std::fstream进行非序列化,c++,serialization,fstream,C++,Serialization,Fstream,使用这样的东西从文件中读取序列化数据(已知格式+endianness)有什么特别糟糕或幼稚的地方吗?我不担心可移植性,实际上它只会被我使用。我知道一个问题是试图提取到非打包的POD结构,尽管我总是可以为每个这样的结构定义一个单独的操作符> template<typename T> inline std::fstream& operator> (std::fstream& fs, T& i) { static_assert(std::is_pod&

使用这样的东西从文件中读取序列化数据(已知格式+endianness)有什么特别糟糕或幼稚的地方吗?我不担心可移植性,实际上它只会被我使用。我知道一个问题是试图提取到非打包的POD结构,尽管我总是可以为每个这样的结构定义一个单独的
操作符>

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;
模板内联std::fstream&operator>(std::fstream&fs,T&i){
静态_断言(std::is_pod::value,“Not pod”);
fs.read(重新解释铸件和铸件),尺寸为i;
返回fs;
}
模板内联std::fstream&operator>(std::fstream&fs,std::vector&v){
静态_断言(std::is_pod::value,“Not pod”);
fs.read(重新解释铸件(&v[0]),sizeof(T)*v.size();
返回fs;
}
模板内联std::fstream&operator>(std::fstream&fs,std::vector&v){
用于(自动和i:v)
fs>i;
返回fs;
}
内联std::fstream&operator>(std::fstream&fs,std::string&s){
fs.read(重新解释类型(&s[0]),s.size();
返回fs;
}
std::fstream f(“文件”,std::ifstream::in | std::ifstream::out | std::ifstream::binary);
int i;
查尔j;
std::vector-vec(5,std::vector(8));
f>i>j>vec;

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

我可以加上超载“>”,因为这是可怕的超载滥用;如果 如果你想阅读一种特殊的格式,合乎逻辑的方法是 定义相应的类(
ixdrstream
),并重载 “>>”谢谢。(
ixdrstream
可能会从 当然,std::basic_ios,并且几乎肯定会使用 标准
streambuf
用于实际输入。)

当然,您永远不会在std::fstream上超载,而是在
std::istream
(或用于输出的
std::ostream
)。(FWIW,我不认为 我曾经使用过
std::fstream
。stream这个习惯用法实际上并不适用
支持优雅地混合读写。)

Eh?您已更改了
运算符>
的含义?为什么不使用
操作符>>