Що означає гідратація об'єкта?


204

Коли хтось говорить про гідратацію об’єкта, що це означає?

У Інтернеті я бачу проект Java під назвою Hydrate, який перетворює дані між різними представленнями (RDMS в OOPS в XML). Це загальне значення гідратації об'єкта; перетворювати дані між уявленнями? Чи може це означати реконструкцію ієрархії об’єктів із збереженого подання?


3
Будь ласка, подивіться також це питання, на яке є чудова відповідь. Це не зовсім те саме питання, тому я не голосую, щоб закрити. Але це добре пояснює гідратацію: stackoverflow.com/questions/4929243/…
Ерік Робертсон

Відповіді:


124

Що стосується більш загального терміна гідрат

Гідратація об'єкта - це об'єкт, який існує в пам'яті, який ще не містить даних про домен ("справжні" дані), а потім заповнення його даними домену (наприклад, з бази даних, мережі або з файлу система).

З коментарів Еріка Робертсона до цієї відповіді:

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

Якщо вам не потрібно хвилюватися з приводу продуктивності продукту, і ви не налагоджуєте оптимізацію продуктивності, що знаходиться у внутрішній програмі API доступу до даних, вам, ймовірно, не потрібно чітко займатися з гідратацією. Зазвичай ви замість цього використовуєте десяріалізацію, щоб ви могли писати менше коду. Деякі API доступу до даних не надають вам цього варіанту, і в тих випадках вам також доведеться самостійно викликати крок гідратації.

Більш детально про концепцію гідратації дивіться відповідь Еріка Робертсона на це ж запитання.

Стосовно проекту Java називається гідрат

Ви конкретно запитали про цю рамку, тому я розглядав її.

Як найкраще я можу сказати, я не думаю, що цей проект використовував слово "гідрат" в дуже загальному значенні. Я бачу його вживання в назві як приблизний синонім «серіалізація». Як було пояснено вище, це використання не зовсім точне:

Дивіться: http://en.wikipedia.org/wiki/Серіялізація

переведення структур даних або стану об'єкта у формат, який може бути збережений [...] та реконструйований пізніше в тому ж чи іншому комп’ютерному середовищі.

Я не можу знайти причину їхнього імені безпосередньо у FAQ щодо гідратів , але я отримав підказки щодо їх наміру. Я думаю, що вони вибрали назву "Hydrate", тому що призначення бібліотеки схоже на популярну звукову систему Hibernate , але вона була розроблена з точно протилежним робочим процесом.

Більшість ОРМ, включаючи сплячий режим, використовують орієнтований на пам'ять об'єктно-модельний підхід, при цьому база даних займає друге врахування. Натомість бібліотека Hydrate використовує підхід, орієнтований на схему баз даних, зберігаючи ваші реляційні структури даних і дозволяючи вашій програмі працювати більш чітко над ними.

Метафорично кажучи, що стосується назви цієї бібліотеки: Гідрат - це як "зробити щось готове до вживання" (наприклад, повторне зволоження сушених продуктів ). Це метафорична протилежність режиму сплячки , що більше нагадує "відкласти щось на зиму" (як сплячка тварин ).

Рішення про назву бібліотеки Hydrate, наскільки я можу сказати, не стосувалося загального терміна комп'ютерного програмування «гідрат».

Використовуючи загальний термін "гідрат" комп'ютерного програмування, оптимізація продуктивності зазвичай є мотивацією (або налагодженням існуючих оптимізацій). Навіть якщо бібліотека підтримує деталізований контроль над тим, як і як об’єкти заповнюються даними, тимчасові показники та ефективність, здається, не є основною мотивацією для імені або функціональності бібліотеки. Бібліотека, здається, більше стурбована тим, що дозволяє чітке відображення та збереження схем.


79
-1 Гідратація відноситься до заповнення наявного об'єкта даними. Це не синонім серіалізації.
Ерік Робертсон

20
Це не є синонімом десеріалізації. Десеріалізація передбачає створення об'єкта з даними, які він мав на момент його серіалізації. Гідратація стосується того, як ви заповнюєте об'єкт даними. Це тонка різниця, але це різниця. Наприклад, ви не можете частково десеріалізувати об'єкт. (принаймні, не через будь-який стандартний API)
Ерік Робертсон

5
Ми всі намагаємось вчитися. Якщо я вважаю це непотрібним, я його зніму, і я ціную дискусію. Моя відповідь не орієнтована на Java, оскільки я здебільшого використовував термін "гідратація" щодо PHP. Відповідь на питання "Що означає гідратація об'єкта?" є "заповнення існуючого об'єкта даними". Об'єкт повинен існувати ще до того, як ви зможете його гідратати, що не відповідає дійсності для десеріалізації. deserialization == instantiation + hydration
Ерік Робертсон

2
Вибачте, у мене є проблема позначити вас у цій відповіді, Мерлін Морган-Грехем. Він видаляється, коли я його зберігаю. Я також приймаю питання з придушенням придушення до десеріалізації. Я відредагував пов'язану статтю у Вікіпедії, щоб видалити заявку, яка не вимагається. Надування для мене означає якусь рутину декомпресії. Процедура серіалізації є ортогональною для стиснення.
Ерік Робертсон

2
@ErickRobertson Сторонне зауваження: знаряддя @fooне потрібне під час відповіді на повідомлення автора.
Дункан Джонс

230

Під гідратацією розуміється процес заповнення об’єкта даними. Об'єкт, який ще не був гідратований, був створений екземпляром і являє собою сутність, яка має дані, але дані ще не завантажені в об'єкт. Це те, що робиться з міркувань продуктивності.

Крім того, термін гідратація використовується при обговоренні планів завантаження даних з баз даних або інших джерел даних. Ось кілька прикладів:

Ви можете сказати, що об’єкт частково гідратний, коли ви завантажили в нього лише деякі поля, але не всі. Це можна зробити, оскільки ті інші поля не потрібні для ваших поточних операцій. Тому немає ніяких причин витрачати пропускну здатність та цикли процесора на завантаження, передачу та встановлення цих даних, коли вони не використовуватимуться.

Крім того, є деякі ORM, такі як Doctrine, які не гідрують об'єкти під час їх інстанції, а лише тоді, коли доступ до даних в цьому об'єкті. Це один метод, який допомагає не завантажувати дані, які не збираються використовувати.


7
+1; Це більш повна відповідь, ніж моя, в контексті Java та гідратації. Як і в моїй відповіді, він все ще є повністю синонімом загального терміна «десеріалізація», але найчастіше використовується в 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 }));

Десеріалізувати

console.log(JSON.parse('{"foo":true,"bar":true,"baz":true}'));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.