Что значит увлажнить объект?

206

Когда кто-то говорит о увлажнении объекта, что это значит?

Я вижу в сети Java-проект под названием Hydrate, который преобразует данные между различными представлениями (RDMS в OOPS в XML). Это общий смысл гидратации объекта; преобразовать данные между представлениями? Может ли это означать восстановление иерархии объектов из сохраненного представления?

Джим
источник
3
Пожалуйста, посмотрите также этот вопрос, на который есть отличный ответ. Это не совсем тот же вопрос, поэтому я не голосую, чтобы закрыть. Но это хорошо объясняет гидратацию: stackoverflow.com/questions/4929243/…
Эрик Робертсон

Ответы:

126

Что касается более общего термина гидрат

При гидратации объекта берется объект, который существует в памяти, но еще не содержит данных домена («настоящие» данные), а затем заполняет его данными домена (например, из базы данных, из сети или из файла). система).

Из комментариев Эрика Робертсона к этому ответу:

десериализация == реализация + гидратация

Если вам не нужно беспокоиться о быстром росте производительности и вы не отлаживаете оптимизацию производительности, которая находится внутри API доступа к данным, то вам, вероятно, не нужно явно иметь дело с гидратацией. Вместо этого вы обычно используете десериализацию, чтобы писать меньше кода. Некоторые API доступа к данным не дают вам такой возможности, и в этих случаях вам также придется явно вызывать этап гидратации самостоятельно.

Для более подробной информации о концепции гидратации см . Ответ Эрика Робертсона на этот же вопрос.

Что касается проекта Java под названием гидрат

Вы спрашивали об этой структуре конкретно, поэтому я изучил ее.

Насколько я могу судить, я не думаю, что этот проект использовал слово «гидрат» в очень общем смысле. Я вижу его использование в названии в качестве приблизительного синонима для «сериализации». Как объяснено выше, это использование не совсем точно:

Смотрите: http://en.wikipedia.org/wiki/Serialization

перевод структур данных или состояния объекта в формат, который можно [...] сохранить и позже восстановить в той же или другой компьютерной среде.

Я не могу найти причину их имени непосредственно в FAQ по Hydrate , но у меня есть подсказки к их намерению. Я думаю, что они выбрали название «Hydrate», потому что назначение библиотеки аналогично популярному фреймворку Hibernate , похожему на звук , но оно было разработано с учетом совершенно противоположного рабочего процесса.

Большинство ORM, включая Hibernate, используют подход, ориентированный на объектную модель в памяти, с базой данных, принимающей вторую оценку. Вместо этого библиотека Hydrate использует подход, ориентированный на схему базы данных, сохраняя ваши реляционные структуры данных и позволяя вашей программе работать поверх них более аккуратно.

Говоря метафорически, все еще в отношении названия этой библиотеки: « Гидрат» - это как «готовить что-то готовое к употреблению» (как, например, повторное увлажнение сушеных продуктов ). Это метафорическая противоположность Hibernate , которая больше похожа на «отложить что-то на зиму» (например, Animal Hibernation ).

Насколько я могу судить, решение назвать библиотеку Hydrate не было связано с общим термином компьютерного программирования "гидрат".

При использовании общего термина компьютерного программирования «гидрат» оптимизация производительности обычно является мотивацией (или отладкой существующих оптимизаций). Даже если библиотека поддерживает детальный контроль над тем, когда и как объекты заполняются данными, время и производительность не кажутся основной мотивацией для имени или функциональности библиотеки. Библиотека, кажется, больше заинтересована в обеспечении сквозного отображения и сохранения схемы.

Мерлин Морган-Грэм
источник
79
-1 Гидратация относится к заполнению существующего объекта данными. Это не синоним для сериализации.
Эрик Робертсон
20
Это также не синоним десериализации. Десериализация включает создание объекта с данными, которые у него были на момент сериализации. Гидратация относится к тому, как вы заполняете объект данными. Это тонкая разница, но это разница. Вы не можете, например, частично десериализовать объект. (по крайней мере, не через какой-либо стандартный API)
Эрик Робертсон
5
Мы все пытаемся учиться. Если я считаю, что это не нужно, я удалю это, и я ценю обсуждение. Мой ответ не ориентирован на Java, так как я в основном использовал термин «увлажнение» по отношению к PHP. Ответ на вопрос «Что означает увлажнение объекта?» это «заполнение существующего объекта данными». Объект должен существовать до того, как вы сможете его увлажнить, что неверно для десериализации. deserialization == instantiation + hydration
Эрик Робертсон
2
Извините, у меня проблема с пометкой вас в этом ответе, Мерлин Морган-Грэм. Он удаляется, когда я его сохраняю. Я также не согласен с раздуванием, приравниваемым к десериализации. Я отредактировал связанную статью в Википедии, чтобы удалить претензию без источников. Раздувание для меня подразумевает какую-то декомпрессионную рутину. Процедура сериализации ортогональна сжатию.
Эрик Робертсон
2
@ErickRobertson Примечание: @fooне нужно при ответе автору поста.
Дункан Джонс
230

Гидратация относится к процессу заполнения объекта данными. Объект, который еще не был гидратирован, был создан и представляет объект, у которого есть данные, но данные еще не были загружены в объект. Это то, что сделано из соображений производительности.

Кроме того, термин гидратация используется при обсуждении планов загрузки данных из баз данных или других источников данных. Вот некоторые примеры:

Вы можете сказать, что объект частично увлажнен, когда вы загрузили в него только некоторые поля, но не все. Это может быть сделано, потому что эти другие поля не нужны для ваших текущих операций. Поэтому нет необходимости тратить пропускную способность и циклы ЦП на загрузку, передачу и настройку этих данных, когда они не будут использоваться.

Кроме того, есть некоторые ORM, такие как Doctrine, которые не гидратируют объекты при их создании, а только при обращении к данным в этом объекте. Это один из методов, который помогает не загружать данные, которые не будут использоваться.

Эрик Робертсон
источник
7
+1; Это более полный ответ, чем мой, в контексте Java и Hydration. Как я уже сказал, он все еще полностью синонимичен с общим термином десериализация, но чаще всего используется в ORM. Это связано с тем, что API-интерфейсы ORM часто предоставляют контроль над набором данных, которые они получают, что позволяет вам повторно использовать существующее сопоставление объектов вместо того, чтобы создавать новые сопоставления для каждого написанного вами запроса. Возможно, стоит упомянуть, что вы говорите о «ленивой загрузке», поскольку все эти вопросы и ответы
касаются
1
Правильно ли вызывать противоположный процесс получения данных из объекта - извлечение? Извлечь данные из объекта.
Олег Абражаев
43

Несмотря на то, что, как упоминал Мерлин, это несколько избыточно на местном языке, но по моему опыту оно относится только к заполнению / заполнению объекта, а не к его созданию / созданию, поэтому это полезное слово, когда вам нужно быть точным.

Дж. Димео
источник
5
Я передумал, и теперь я согласен, что этот ответ является более точным, чем мой старый ответ. С тех пор я отредактировал свой ответ (так как он был принят, и я хочу, чтобы он был точным). Теперь, надеюсь, теперь это отражает разницу между десериализацией и гидратацией (в частности, deserialization == instantiation + hydration).
Мерлин Морган-Грэм
8

Это довольно старый вопрос, но кажется, что смысл следующих терминов все еще неясен. Надеюсь, это будет однозначно.

гидроокись

Когда вы видите описания, в которых говорится что-то вроде: «объект, ожидающий данных, ожидает гидратации», это сбивает с толку и вводит в заблуждение. Объекты не ждут чего-то, а гидратация - это просто процесс заполнения объекта данными.

Используя JavaScript в качестве примера:

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

Все, что добавляет ценности, obj«увлажняет» это. Я просто использую Object.assign()в этом примере.

Так как термины «сериализация» и «десериализация» были также упомянуты в других ответах, вот примеры, которые помогают устранить неоднозначность значения этих понятий от гидратации:

Сериализация

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

Deserialize

console.log(JSON.parse('{"foo":true,"bar":true,"baz":true}'));
jonschlinkert
источник