水合物体意味着什么?

Jim*_*Jim 180 java oop

当有人谈论保湿物体时,这意味着什么?

我在Web上看到一个名为Hydrate的Java项目,它在不同的表示形式(RDMS到OOPS到XML)之间转换数据.这是物体水化的一般含义; 在表示之间转换数据?这可能意味着从存储的表示重建对象层次结构吗?

Eri*_*son 212

水合是指用数据填充对象的过程.尚未被水合的对象已被实例化,并且表示具有数据的实体,但数据尚未加载到对象中.这是出于性能原因而完成的.

此外,在讨论从数据库或其他数据源加载数据的计划时,使用术语水合作用.这里有些例子:

当你只将一些字段加载到其中时,你可以说一个物体是部分水合的,但不是全部.这可以完成,因为当前操作不需要其他字段.因此没有理由在不使用时浪费带宽和CPU周期加载,传输和设置这些数据.

此外,还有一些ORM,例如Doctrine,它们在实例化时不会对对象进行水合,但只有在该对象中访问数据时才会对其进行水合.这是一种有助于不加载不会被使用的数据的方法.

  • +1; 在Java和Hydration的上下文中,这是一个比我更完整的答案.正如我的回答所说,它仍然完全与反序列化这一术语完全同义,但最常用于ORM.这是因为ORM API通常提供对它们检索的数据集的控制,允许您重用现有的对象映射,而不必为您编写的每个查询编写新的映射.可能想提一下你说的是"懒加载",因为这个Q&A都是关于术语的:) (7认同)
  • 调用从对象中获取数据的相反过程是否正确 - 提取?从对象中提取数据。 (2认同)

Mer*_*ham 107

关于更通用的术语水合物

保护对象正在获取存在于内存中的对象,该对象尚未包含任何域数据("真实"数据),然后使用域数据(例如来自数据库,来自网络或来自文件)填充它系统).

来自Erick Robertson对此答案的评论:

反序列化==实例化+水合作用

如果您不需要担心性能飙升,并且您没有调试数据访问API内部的性能优化,那么您可能不需要明确处理水合作用.您通常会使用反序列化,因此您可以编写更少的代码.某些数据访问API不会为您提供此选项,在这些情况下,您还必须自己明确调用水合步骤.

有关水化概念的更多细节,请参阅Erick Robertson对同一问题的回答.

关于名为hydrate的Java项目

你专门询问了这个框架,所以我调查了一下.

据我所知,我不认为这个项目在一般意义上使用了"水合物"这个词.我认为它在标题中的用法是"序列化"的近似同义词.如上所述,这种用法并不完全准确:

请参阅:http://en.wikipedia.org/wiki/Serialization

将数据结构或对象状态转换为可以在以后在相同或另一个计算机环境中存储和重建的格式.

我不能直接在Hydrate FAQ上找到他们名字背后的原因,但我得到了他们意图的线索.我认为他们选择了"Hydrate"这个名字,因为该库的目的与流行的类似声音的Hibernate框架类似,但它的设计与完全相反的工作流程设计.

包括Hibernate在内的大多数ORM采用面向内存的面向对象模型的方法,数据库是第二个考虑因素.Hydrate库采用面向数据库模式的方法,保留您的关系数据结构,让您的程序更干净地在它们之上工作.

隐喻地说,仍然是关于这个图书馆的名字:水合物就像"制作一些可以随时使用的东西"(如重新保湿干燥食品).这是Hibernate的一个隐喻,它更像是"为冬天放些东西"(如Animal Hibernation).

据我所知,决定命名库Hydrate并不关心通用计算机编程术语"水合物".

当使用通用计算机编程术语"水合物"时,性能优化通常是动机(或调试现有的优化).即使库支持对对象填充数据的时间和方式进行精细控制,时间和性能似乎也不是名称或库功能的主要动机.该库似乎更关注实现端到端映射和模式保存.

  • -1水合是指用数据填充现有对象.它不是序列化的同义词. (78认同)
  • 它也不是反序列化的同义词.反序列化涉及使用序列化时的数据创建对象.水合作用是指如何使用数据填充对象.这是一个微妙的差异,但它是一个区别.例如,您不能部分反序列化对象.(至少,不通过任何标准API) (20认同)
  • 我们都在努力学习.如果我认为这是不必要的,我会删除它,我很感激讨论.我的答案不是以Java为中心,因为我实际上大多使用了关于PHP的术语"水合作用"."对象保湿是什么意思?"这个问题的答案.是"用数据填充现有对象".在对其进行水合之前,该对象必须存在,而对于反序列化则不然.`deserialization == instantiation + hydration` (5认同)
  • 抱歉,我在回答这个问题时遇到了问题,Merlyn Morgan-Graham.当我保存它时它会被删除.我也提出将膨胀等同于反序列化的问题.我编辑了链接的维基百科文章,以删除未提供的声明.向我膨胀意味着某种减压程序.序列化例程与压缩正交. (2认同)
  • @ErickRobertson旁注:回复帖子作者时不需要`@ foo`. (2认同)

J. *_*meo 43

虽然它是作为Merlyn提到有些多余白话,我的经验是指对填充/填充的对象,而不是实例化/创建它,所以它是一个有用的词,当你需要精确.

  • 我改变了主意,现在我同意这个答案比我以前的答案更准确.我已经编辑了我的答案(因为它已被接受,我希望它是准确的).现在希望它现在反映了反序列化和水合作用之间的区别(特别是"反序列化==实例化+水合作用"). (5认同)
  • +1.我认为你的答案更准确. (4认同)

jon*_*ert 22

这是一个相当古老的问题,但似乎对以下术语的含义仍然存在混淆。希望这将消除歧义。

水合物

当您看到诸如“一个正在等待数据的对象,正在等待被水化”之类的描述时,这令人困惑和误导。对象不会等待事物,而水化只是用数据填充对象的行为。

以 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
Run Code Online (Sandbox Code Playgroud)

任何增加价值的东西obj都是“保湿”它。我只是Object.assign()在这个例子中使用。

由于在其他答案中也提到了“序列化”和“反序列化”这两个术语,因此以下示例有助于消除这些概念与水合的含义:

连载

console.log(JSON.stringify({ foo: true, bar: true, baz: true }));
Run Code Online (Sandbox Code Playgroud)

反序列化

console.log(JSON.parse('{"foo":true,"bar":true,"baz":true}'));
Run Code Online (Sandbox Code Playgroud)

  • 现实生活中的例子有很大的好处。 (2认同)