El enfoque común en C++ es proporcionar funciones que pueden serializar su tipo personalizado en un objeto 'stream', y luego proporcionar una manera de obtener un puntero al inicio del bloque de datos que se acumuló en la secuencia.
Un ejemplo sencillo de esto es std :: ostringstream que se puede utilizar para serializar los datos en una corriente y luego obtener un puntero a la cadena construida:
int i = 13;
std::string message = "Hi";
std::ostringstream stream;
stream << i << message;
cout << stream.str() << endl; // prints "13Hi";
Se podría hacer lo mismo para su tipo Data
proporcionando sobrecargas apropiadas del operador <<
y >>
, como en:
std::ostringstream &operator<<(std::ostringstream &stream, const Data &v) {
return stream << v.length << v.message;
}
std::ostringstream &operator>>(std::ostringstream &stream, Data &v) {
return stream >> v.length; >> v.message;
}
el uso de estas funciones, usted puede hacer esto:
Data myData = { 13, "Hello" };
std::ostringstream stream;
stream << myData;
const std::string serializedData = stream.str();
send(.., serializedData.c_str(), serializedData.size() + 1, ..);
del tamaño de recepción, se puede leer los datos en un búfer y luego usar un objeto std::istringstream
para extraer los datos de nuevo:
const char receivedData[ 1024 ];
// fill receivedData array using recv()
std::string s = receivedData;
std::istringstream stream(s);
Data myData;
stream >> myData;
Es posible que necesite para amortiguar los datos recibidos un poco hasta que la lectura de la corriente tiene éxito.
El tema que está tropezando es "serialización", no encapsulación. – tenfour
+1 Curioso sobre cómo hacer esto de la manera C++. También debería preguntar si debe preocuparse por los problemas endian. – Jeff