¿Qué significa hidratar un objeto?

206

Cuando alguien habla de hidratar un objeto, ¿qué significa eso?

Veo un proyecto Java llamado Hydrate en la web que transforma datos entre diferentes representaciones (RDMS a OOPS a XML). ¿Es este el significado general de la hidratación del objeto; transformar datos entre representaciones? ¿Podría significar reconstruir una jerarquía de objetos a partir de una representación almacenada?

Jim
fuente
3
Consulte también esta pregunta, que tiene una excelente respuesta. No es exactamente la misma pregunta, así que no voy a votar para cerrar. Pero explica bien la hidratación: stackoverflow.com/questions/4929243/…
Erick Robertson

Respuestas:

126

Con respecto al término más genérico hidrato

Hidratar un objeto es tomar un objeto que existe en la memoria, que aún no contiene ningún dato de dominio (datos "reales"), y luego llenarlo con datos de dominio (como de una base de datos, de la red o de un archivo sistema).

De los comentarios de Erick Robertson sobre esta respuesta:

deserialización == instanciación + hidratación

Si no necesita preocuparse por el rendimiento de las ampollas, y no está depurando las optimizaciones de rendimiento que se encuentran en el interior de una API de acceso a datos, entonces probablemente no necesite lidiar explícitamente con la hidratación. Por lo general, usaría la deserialización para poder escribir menos código. Algunas API de acceso a datos no le dan esta opción, y en esos casos también tendría que llamar explícitamente al paso de hidratación usted mismo.

Para un poco más de detalle sobre el concepto de hidratación, vea la respuesta de Erick Robertson sobre esta misma pregunta.

Con respecto al proyecto Java llamado hidrato

Preguntaste sobre este marco específicamente, así que lo examiné.

Por lo que puedo decir, no creo que este proyecto haya usado la palabra "hidrato" en un sentido muy genérico. Veo su uso en el título como sinónimo aproximado de "serialización". Como se explicó anteriormente, este uso no es del todo exacto:

Ver: http://en.wikipedia.org/wiki/Serialization

traducir estructuras de datos o estado de objetos a un formato que pueda almacenarse [...] y reconstruirse más tarde en el mismo entorno informático o en otro.

No puedo encontrar la razón detrás de su nombre directamente en las Preguntas frecuentes sobre hidratos , pero obtuve pistas sobre su intención. Creo que eligieron el nombre "Hydrate" porque el propósito de la biblioteca es similar al popular marco Hibernate similar al sonido , pero fue diseñado con el flujo de trabajo exactamente opuesto en mente.

La mayoría de los ORM, incluido Hibernate, adoptan un enfoque orientado al modelo de objetos en memoria, y la base de datos toma una segunda consideración. En cambio, la biblioteca Hydrate adopta un enfoque orientado al esquema de la base de datos, preservando sus estructuras de datos relacionales y permitiendo que su programa trabaje sobre ellas de manera más limpia.

Hablando metafóricamente, aún con respecto al nombre de esta biblioteca: el hidrato es como "hacer algo listo para usar" (como rehidratar los alimentos secos ). Es un opuesto metafórico de Hibernate , que es más como "guardar algo para el invierno" (como Hibernación Animal ).

La decisión de nombrar el hidrato de la biblioteca, por lo que puedo decir, no estaba relacionada con el término genérico de programación informática "hidrato".

Cuando se utiliza el término genérico de programación informática "hidrato", las optimizaciones de rendimiento suelen ser la motivación (o depurar las optimizaciones existentes). Incluso si la biblioteca admite un control granular sobre cuándo y cómo se rellenan los objetos con datos, el tiempo y el rendimiento no parecen ser la motivación principal para el nombre o la funcionalidad de la biblioteca. La biblioteca parece más preocupada por habilitar el mapeo de extremo a extremo y la preservación del esquema.

Merlyn Morgan-Graham
fuente
79
-1 Hidratación se refiere a llenar un objeto existente con datos. No es sinónimo de serialización.
Erick Robertson
20
Tampoco es sinónimo de deserialización. La deserialización implica crear el objeto con los datos que tenía en el momento en que se serializó. La hidratación se refiere a cómo llenar un objeto con datos. Es una diferencia sutil, pero es una diferencia. No puede, por ejemplo, deserializar parcialmente un objeto. (al menos, no a través de ninguna API estándar)
Erick Robertson
55
Todos estamos tratando de aprender. Si creo que no es necesario, lo eliminaré, y agradezco la discusión. Mi respuesta no está centrada en Java, ya que en su mayoría he usado el término "hidratación" con respecto a PHP en realidad. La respuesta a la pregunta "¿Qué significa hidratar un objeto?" es "llenar un objeto existente con datos". El objeto tiene que existir antes de poder hidratarlo, lo cual no es cierto para la deserialización. deserialization == instantiation + hydration
Erick Robertson
2
Lo siento, tengo un problema para etiquetarte en esta respuesta, Merlyn Morgan-Graham. Se está quitando cuando lo guardo. También estoy en desacuerdo con que la inflación se equipare con la deserialización. Edité el artículo vinculado de Wikipedia para eliminar el reclamo sin fuente. Inflar para mí implica algún tipo de rutina de descompresión. Una rutina de serialización es ortogonal a la compresión.
Erick Robertson
2
@ErickRobertson Nota al margen: @foono es necesario cuando se responde al autor de la publicación.
Duncan Jones
230

La hidratación se refiere al proceso de llenar un objeto con datos. Un objeto que aún no se ha hidratado se ha instanciado y representa una entidad que tiene datos, pero los datos aún no se han cargado en el objeto. Esto es algo que se hace por razones de rendimiento.

Además, el término hidratación se usa cuando se discuten planes para cargar datos de bases de datos u otras fuentes de datos. Aquí hay unos ejemplos:

Se podría decir que un objeto está parcialmente hidratado cuando solo ha cargado algunos de los campos, pero no todos. Esto se puede hacer porque esos otros campos no son necesarios para sus operaciones actuales. Por lo tanto, no hay razón para desperdiciar el ancho de banda y los ciclos de la CPU cargando, transfiriendo y configurando estos datos cuando no se van a usar.

Además, hay algunos ORM, como Doctrine, que no hidratan objetos cuando se instancian, sino solo cuando se accede a los datos en ese objeto. Este es un método que ayuda a no cargar datos que no se van a utilizar.

Erick Robertson
fuente
77
+1; Esta es una respuesta más completa que la mía, en el contexto de Java e Hidratación. Todavía es completamente sinónimo del término general de deserialización, como decía mi respuesta, pero se usa más comúnmente en ORM. Esto se debe a que las API de ORM a menudo ofrecen control sobre el conjunto de datos que recuperan, lo que le permite reutilizar una asignación de objetos existente en lugar de tener que escribir nuevas asignaciones para cada consulta que escriba. Es posible que desee mencionar que está hablando de "carga perezosa", ya que estas preguntas y respuestas tienen que ver con la terminología :)
Merlyn Morgan-Graham
1
¿Es correcto llamar a un proceso opuesto para obtener datos de la extracción de objetos? Extraer datos del objeto.
Oleg Abrazhaev
43

Si bien es algo redundante como lo mencionó Merlyn, en mi experiencia se refiere solo a llenar / poblar un objeto, no a instanciarlo / crearlo, por lo que es una palabra útil cuando necesita ser preciso.

J. Dimeo
fuente
55
He cambiado de opinión y ahora estoy de acuerdo en que esta respuesta es más precisa que mi respuesta anterior. Desde entonces he editado mi respuesta (ya que fue aceptada y quiero que sea precisa). Esperemos que ahora refleje la diferencia entre deserialización e hidratación (en particular deserialization == instantiation + hydration).
Merlyn Morgan-Graham
8

Esta es una pregunta bastante antigua, pero parece que todavía hay confusión sobre el significado de los siguientes términos. Con suerte, esto lo desambiguará.

Hidratar

Cuando vea descripciones que dicen cosas como "un objeto que está esperando datos, está esperando ser hidratado", eso es confuso y engañoso. Los objetos no esperan cosas, y la hidratación es solo el acto de llenar un objeto con datos.

Usando JavaScript como ejemplo:

const obj = {}; // empty object
const data = { foo: true, bar: true, baz: true };

// Hydrate "obj" with "data" 
Object.assign(obj, data); 
console.log(obj.foo); // true
console.log(obj.bar); // true
console.log(obj.baz); // true

Cualquier cosa que agregue valores objes "hidratarlo". Solo estoy usando Object.assign()en este ejemplo.

Dado que los términos "serializar" y "deserializar" también se mencionaron en otras respuestas, aquí hay ejemplos para ayudar a desambiguar el significado de esos conceptos de la hidratación:

Publicar por fascículos

console.log(JSON.stringify({ foo: true, bar: true, baz: true }));

Deserializar

console.log(JSON.parse('{"foo":true,"bar":true,"baz":true}'));
jonschlinkert
fuente