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.