¿Cómo 'de-serializa' una clase derivada de datos serializados? O tal vez debería decir, ¿hay una mejor manera de "deserializar" los datos en clases derivadas?¿Cómo 'de-serializar' una clase derivada de datos serializados?
Por ejemplo, supongamos que tiene una clase base virtual pura (B) heredada por otras tres clases, X, Y y Z. Además, tenemos un método, serialize(), que traducirá X: B, Y: B y Z: B en datos serializados.
De esta manera se puede pasar a través de un socket, un tubo con nombre, etc. a un proceso remoto.
El problema que tengo es, ¿cómo creamos un objeto apropiado a partir de los datos serializados?
La única solución que se me ocurre es incluir un identificador en los datos serializados que indica el tipo de objeto derivado final. Donde el receptor, primero analiza el campo de tipo derivado de los datos serializados, y luego usa una declaración de conmutación (o algún tipo de lógica como esa) para invocar el constructor apropiado.
Por ejemplo:
B deserialize(serial_data)
{
parse the derived type from the serial_data
switch (derived type)
case X
return X(serial_data)
case Y
return Y(serial_data)
case Z
return Z(serial_data)
}
Así que después de conocer el tipo de objeto derivado que invocar el constructor de tipo derivada adecuada.
Sin embargo, esto se siente incómodo y engorroso. Espero que haya una manera más elocuente de hacer esto. ¿Esta ahí?
serialización compacto (bit a bit) puede morder a la derecha en el culo, sobre todo si va a guardar el material en archivos. A medida que pasan los años y las clases cambian, estás bastante jodido cuando tratas de cargarlos de nuevo. Por esa razón, hacer que los archivos sean auto-documentados y versionados es una buena idea. Solo si el cliente y el servidor acuerdan en todo momento el protocolo utilizado, ¿está bien enviar bytes directos? Si no, entonces recurriría a 'XML/JSON'. Sin embargo, también buscaría cosas que pueden hacer esto más fácil, como 'SOAP', etc. –
@Hamish +1, ¡haz que una respuesta! –