オブジェクトをハイドレートするとはどういう意味ですか?


205

誰かがオブジェクトの水和について話すとき、それはどういう意味ですか?

異なる表現(RDMSからOOPS、XML)の間でデータを変換するWeb上でHydrateと呼ばれるJavaプロジェクトを見つけました。これはオブジェクトのハイドレーションの一般的な意味ですか?表現間でデータを変換するには?保存された表現からオブジェクト階層を再構築することを意味するのでしょうか?


3
すばらしい答えを持っているこの質問も見てください。まったく同じ質問ではないので、締めくくるつもりはありません。しかし、それは十分に水分補給を説明しますstackoverflow.com/questions/4929243/...
エリック・ロバートソン

回答:


124

より一般的な用語ハイドレートに関して

オブジェクトをハイドレートするとは、メモリ内に存在し、まだドメインデータ(「実際の」データ)が含まれていないオブジェクトを取得してから、ドメインデータ(データベース、ネットワーク、ファイルなど)を入力することです。システム)。

この答えに関するエリックロバートソンのコメントから:

逆シリアル化==インスタンス化+ハイドレーション

ブリスターパフォーマンスについて心配する必要がなく、データアクセスAPIの内部にあるパフォーマンス最適化をデバッグしていない場合は、おそらくハイドレーションを明示的に処理する必要はありません。代わりに通常は逆シリアル化を使用して、より少ないコードを記述できるようにします。一部のデータアクセスAPIにはこのオプションがありません。そのような場合は、水和ステップを自分で明示的に呼び出す必要があります。

ハイドレーションの概念についてもう少し詳しくは、この同じ質問に対するErick Robertsonの回答を参照してください。

ハイドレートと呼ばれるJavaプロジェクトに関して

このフレームワークについて具体的に質問されたので、調査しました。

私の知る限りでは、このプロジェクトで「ハイドレート」という言葉を非常に一般的な意味で使用したことはないと思います。タイトルでの使用は、「シリアル化」のおおよその同義語だと思います。上で説明したように、この使用法は完全に正確ではありません。

参照:http : //en.wikipedia.org/wiki/Serialization

データ構造またはオブジェクトの状態を、[...]保存して同じまたは別のコンピューター環境で後で再構築できる形式に変換する。

彼らの名前の背後にある理由を直接Hydrate FAQで見つけることはできませんが、私は彼らの意図の手がかりを得ました。ライブラリの目的は人気のあるサウンドに似たHibernateフレームワークに似ているため、彼らは「ハイドレート」という名前を選んだと思いますが、これはまったく逆のワークフローを念頭に置いて設計されました。

ほとんどのORM(Hibernateを含む)は、メモリ内のオブジェクトモデル指向のアプローチを採用しており、データベースは2番目の考慮事項を考慮しています。代わりに、Hydrateライブラリーは、データベーススキーマ指向のアプローチを採用し、リレーショナルデータ構造を維持し、プログラムがそれらの上でよりきれいに動作できるようにします。

比喩的に言えば、まだこのライブラリーの名前に関して:水和物は「何かをすぐに使えるようにする」(乾燥食品を再水和するなど)のようなものです。これはHibernateの比喩的な反対であり、「冬のために何かを捨てる」(Animal Hibernationのような)のようなものです。

ライブラリをハイドレートと名付ける決定は、私が知る限り、一般的なコンピュータプログラミング用語「ハイドレート」に関係するものではありませんでした。

一般的なコンピュータープログラミング用語「ハイドレート」を使用する場合、パフォーマンスの最適化は通常、動機(または既存の最適化のデバッグ)です。ライブラリがオブジェクトにデータをいつ、どのように入力するかをきめ細かく制御できる場合でも、タイミングとパフォーマンスは、名前やライブラリの機能の主な動機ではないようです。ライブラリは、エンドツーエンドのマッピングとスキーマの保持を有効にすることに、より関心があるようです。


79
-1水和とは、既存のオブジェクトをデータで埋めることを指します。シリアル化の同義語ではありません。
エリックロバートソン

20
逆シリアル化の同義語でもありません。逆シリアル化では、シリアル化された時点のデータを使用してオブジェクトを作成します。水和とは、オブジェクトをデータで埋める方法を指します。微妙な違いですが、違いです。たとえば、オブジェクトを部分的に逆シリアル化することはできません。(少なくとも、標準のAPIを介してではありません)
Erick Robertson

5
私たちは皆学ぼうとしています。不要と思われる場合は削除させていただきますので、よろしくお願いいたします。私の答えはJava中心ではありません。私は実際にPHPに関して「ハイドレーション」という用語をほとんど使用しているためです。「オブジェクトのハイドレーションとはどういう意味ですか?」という質問への回答 「既存のオブジェクトにデータを入力する」です。オブジェクトは、ハイドレートする前に存在している必要があります。これは、逆シリアル化には当てはまりません。 deserialization == instantiation + hydration
エリックロバートソン

2
申し訳ありませんが、この回答であなたのタグ付けに問題があります、Merlyn Morgan-Graham。保存すると削除されます。また、インフレートは逆シリアル化と同じだという問題も取り上げます。リンクされているウィキペディアの記事を編集して、出典不明の申し立てを削除しました。私にとって膨らませることは、ある種の減圧ルーチンを意味します。シリアル化ルーチンは圧縮と直交しています。
エリックロバートソン

2
@ErickRobertson補足:@foo投稿者に返信する場合は必要ありません。
ダンカンジョーンズ

230

水和とは、オブジェクトをデータで埋めるプロセスを指します。まだハイドレートされていないオブジェクトがインスタンス化され、データを持つエンティティを表していますが、データはまだオブジェクトにロードされていません。これは、パフォーマンス上の理由で行われるものです。

さらに、ハイドレーションという用語は、データベースまたはその他のデータソースからデータをロードするための計画を説明するときに使用されます。ここではいくつかの例を示します。

一部のフィールドのみをロードし、すべてをロードしていない場合、オブジェクトは部分的にハイドレートされていると言えます。これらの他のフィールドは現在の操作には必要ないため、これを行うことができます。そのため、このデータを使用しないときに、帯域幅とCPUサイクルを浪費して、このデータをロード、転送、および設定する理由はありません。

さらに、DoctrineのようないくつかのORMがあり、それらはインスタンス化されたときにオブジェクトをハイドレートしませんが、そのオブジェクトでデータがアクセスされた場合のみです。これは、使用されないデータを読み込まないようにする1つの方法です。


7
+1; これは、Javaとハイドレーションのコンテキストでは、私よりも完全な答えです。私の答えが述べたように、それはまだ一般的な用語の逆シリアル化と同義ですが、ORMで最も一般的に使用されます。これは、ORM APIが取得する一連のデータを制御できることがよくあり、書き込むクエリごとに新しいマッピングを作成する代わりに、既存のオブジェクトマッピングを再利用できるためです。このQ&Aはすべて用語に関するものであるため、「遅延読み込み」について話していることをお伝えしたいと思います:)
Merlyn Morgan-Graham

1
オブジェクトからデータを取得する反対のプロセスを呼び出すことは正しいですか-抽出?オブジェクトからデータを抽出します。
Oleg Abrazhaev

43

Merlynが述べたように多少冗長な言葉遣いですが、私の経験では、オブジェクトのインスタンス化/作成ではなく、オブジェクトの塗りつぶし/生成のみを指しているため、正確にする必要がある場合に役立ちます。


5
私は考えを変えました、そして今、私はこの答えが私の古い答えよりも正確であることに同意します。私はそれ以降、私の回答を編集しました(受け入れられたため、正確にしたいので)。うまくいけば、逆シリアル化とハイドレーション(特にdeserialization == instantiation + hydration)の違いを反映するようになります。
Merlyn Morgan-Graham

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}'));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.