2009-08-21 19 views
10

¿Por qué no todos los tipos de objetos se pueden serializar implícitamente?¿Por qué no se puede serializar todo tipo de objeto?

Según mi comprensión limitada, ¿no se almacenan simplemente los objetos en el montón y los punteros a ellos en la pila?

¿No debería poder recorrerlos programáticamente, almacenarlos en un formato universal y también ser capaz de reconstruirlos desde allí?

+0

¿Qué idioma, marco? –

+1

Solo preguntaba en general ... :-) – Matt

Respuesta

18

Algunos objetos encapsulan recursos como punteros de archivos o conexiones de red que no pueden ser deserializado al estado en que estaban cuando se serializado el objeto de que los contenía.

Ejemplo: usted no debe deserializar un objeto que sirve como una conexión a la base de datos autenticado , porque hacerlo, que había necesidad de la forma serializada a contener una contraseña en texto plano. Esto no sería una buena práctica, porque alguien podría obtener una bodega del formulario guardado serializado. También tienen ni idea de al deserializar que el servidor de base de datos todavía está en marcha, puede ser visitada , la autenticación de credenciales siendo válido, etc.

3

No, porque a veces no tiene toda la información en el lugar donde los reconstruyes Recuerde que puede que no esté reconstruyendo el objeto en el mismo contexto en el que lo tenía; puede ser una máquina diferente o incluso un idioma diferente.

5

Incluso si solo considera objetos que no incluyen el estado del sistema operativo, el problema es más difícil de lo que parece a primera vista. El gráfico puede tener ciclos. Las entidades se pueden referenciar desde múltiples entidades de nivel superior.

Traté de outline a universal serialization library in c in a previous answer, y encontré que hay algunos casos difíciles.

+0

Correcto, puede haber ciclos, etc., pero estos son problemas resueltos. Contraste esto con la insignificancia de serializar un identificador de ventana o un manejador de archivo. –

+0

@Steven Sudit: los caracterizaría como "conocidos por ser solucionables" en lugar de "resueltos". Hay decisiones que deben tomarse: compensaciones entre la cantidad que serializa ahora y cuán idéntica es la estructura deserializada más adelante. Diferentes problemas pueden requerir diferentes opciones. Entonces, los problemas tienen soluciones, pero ninguna solución única servirá para todos los casos. Eso es lo que hace que el problema sea difícil. – dmckee

+0

El problema es difícil, pero otros ya lo han resuelto para nosotros. En .NET, por ejemplo, hay un sistema de serialización perfectamente funcional que maneja ciclos sin problemas. También hay soluciones similares en otras plataformas. Sin embargo, lo que ninguno de ellos puede hacer es serializar cosas como identificadores. Este es un problema más profundo. –

0

Técnicamente, cualquier objeto en un espacio de memoria se puede serializar y persistir en un medio duradero como un disco duro. Después de todo, la mayoría de los OS tienen una memoria activa de página hacia y desde el disco y muchos también tienen una función de estilo de hibernación. El problema es uno de alcance, por ejemplo: usted crea un objeto de cadena en su espacio de memoria, es suyo para serializar y deserializar como mejor le parezca. Cuando abre un archivo, el sistema operativo le proporciona un identificador de archivo, pero el SO todavía posee el sistema de archivos que contiene el objeto de archivo real que tiene. Un controlador de sistema de archivos, por otro lado, tiene que mantener una base de datos persistente de identificadores de archivos y otros metadatos relacionados con archivos.

1

¿Qué sentido tendría serializar un objeto que contiene una conexión de red y es responsable de la transmisión de datos desde un servidor web?

¿Qué tal deserializarlo, cómo funcionaría? En caso de que vuelva a abrir la conexión, vuelva a descargar el archivo?

1

Tiene razón en sus suposiciones, en cierto modo.

Debe ser posible dividir el conjunto de todos los objetos en el programa en grupos

1) Usted tiene la información completa que permite la deconstrucción y la reconstrucción completa del objeto. Las matrices de números o cadenas, las estructuras son buenos ejemplos.

2) Tiene información de construcción. Puede reconstruir el objeto llamando al código externo. Un archivo es un buen ejemplo, pero requiere que su programa tenga una abstracción de archivo que recuerde los parámetros de construcción y estado. Podemos, por ejemplo, guardar la ruta al archivo y la posición en el archivo. Sin embargo, la reconstrucción podría fallar. (Por ejemplo, el archivo fue eliminado o cambiado)

3) No tiene información de construcción, el objeto se recibió de alguna manera al azar.

Aquí, para poder serializar los objetos completamente, tenemos que pasar de 3) a 2) a 1). Los objetos en 3) pueden ser atributos de un objeto de tipo 2) y pueden recuperarse al reconstruir con éxito un objeto de tipo 2).

Un objeto de tipo 2) sin embargo, se debe reconstruir serializando solo la información de construcción, que debe ser de tipo 1), por ejemplo, números y cadenas, datos verdaderos.

Todo este esquema parece costoso, ya que si queremos reconstruir todo el estado del programa, tenemos que trabajar con abstracciones que encapsulan objetos del tipo 2). Y tenemos que saber qué hacemos cuando un objeto no puede ser reconstruido. Además, debemos asegurarnos de no mezclar objetos de estos tipos, de que no mezclemos objetos de tipo 3 o 2 donde esperamos recolectar solo objetos del tipo 1.

Cuestiones relacionadas