C++ – Como serializar objetos e enviar pela rede

(English version here: http://stackoverflow.com/questions/3261227/c-how-to-serialize-an-object-to-send-over-network)

Estava tentando serializar um objeto para enviá-lo pela rede para fazer, de uma forma diferente, um trabalho de programação em redes. Este trabalho era a implementação de um protocolo sobre o protocolo TCP/IP a nível da camada de aplicação.

Pesquisando sobre a serialização de objetos para este propósito foi difícil encontrar algo sem ser relacionado a bibliotecas como Boost++ ou Protocol Buffers. Eu queria usar apenas os recursos da STL de C++.

E consegui!

Como?

Utilizei um objeto do tipo stringstream para serializar objetos e enviei pela rede utilizando o método da str() de stringstream e em seguida o método c_str() de string.

Exemplo:

class Object {
public:
int a;
string b;

void methodSample1 ();
void methosSample2 ();

friend ostream& operator<< (ostream& out, Object& object) {
out << object.a << " " << object.b;   //O espaço (" ") é necessário para separar os elementos
return out;
}

friend istream& operator>> (istream& in, Object& object) {
in >> object.a;
in >> object.b;
return in;
}
};

/* Servidor */
int main () {
Object o;
stringstream ss;
o.a = 1;
o.b = 2;
ss << o;    //serializa

write (socket, ss.str().c_str(), 20); //send - o tamanho do buffer deve ser ajustado, isto é só um exemplo
}

/* Cliente */
int main () {
Object o2;
stringstream ss2;
char buffer[20];
string temp;

read (socket, buffer, 20);  //recebe
temp.assign(buffer);
ss << temp;
ss >> o2;   //deserializa
}

Não tenho certeza se é necessário converter para string antes de serializar (s << o), talvez seja possível diretamente de um char.

Obs.: quando um objeto string que será serializada contiver espaços, ao invés de utilizar in >> object.b deve ser utilizado getline (in, objetc.b). Desta forma toda a string é lida.

Comente este post.

Seu comentário:

*obrigatório/required