Se podría sobrecargar el flujo de salida del operador (<<
) y corriente a cabo cada campo individual (y viceversa)
EDIT: aquí es un ejemplo completo ...
#include <iostream>
#include <fstream>
#include <map>
using namespace std;
template <typename T>
void serialize(ostream& str, const T& field)
{
str.rdbuf()->sputn(reinterpret_cast<const char*>(&field), sizeof(T));
}
template <typename T>
void deserialize(istream& str, T& field)
{
str.rdbuf()->sgetn(reinterpret_cast<char*>(&field), sizeof(T));
}
class MyGame
{
public:
MyGame() : a(), b() {}
MyGame(int av, int bv) : a(av), b(bv) {}
friend ostream& operator<<(ostream& str, MyGame const& game);
friend istream& operator>>(istream& str, MyGame& game);
int getA() const { return a; }
int getB() const { return b; }
private:
int a;
int b;
};
ostream& operator<<(ostream& str, MyGame const& game)
{
serialize(str, game.a);
serialize(str, game.b);
return str;
}
istream& operator>>(istream& str, MyGame& game)
{
deserialize(str, game.a);
deserialize(str, game.b);
return str;
}
int main(void)
{
{
ofstream fout("test.bin", ios::binary);
MyGame game(10, 11);
fout << game;
}
{
ifstream fin("test.bin", ios::binary);
MyGame game;
fin >> game;
cout << "game.a: " << game.getA() << ", game.b: " << game.getB() << endl;
}
return 0;
}
Debe comprender el problemas con este enfoque, como el archivo resultante será específico de la plataforma (es decir, no portátil) etc.
esto no es realmente binario ¿verdad?;) – Nim
también, una secuencia requiere un separador para separar los campos (generalmente un espacio), en este ejemplo falta en la operación de salida de flujo, por lo tanto, la secuencia en funcionamiento simplemente lanzará una excepción cuando intente leer el entero (I pensar, no lo he probado, así que podría estar equivocado) – Nim
Esto no lo va a cortar. En primer lugar, usted está "haciendo trampa" aquí porque no está serializando ningún puntero como lo requiere el OP. Además, está asumiendo que los operadores << and >> harán el truco, cuando es mucho más robusto controlar la serialización de primitivos usted mismo (por ejemplo, qué se hace con htonl() y ntohl() con respecto a la transmisión de datos a través de una red) . – Jon