补水是什么意思?


204

当有人谈论给对象补水时,这是什么意思?

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


3
还请参阅此问题,它有一个很好的答案。这不是一个完全相同的问题,所以我没有投票赞成结束。但它说明了水化得好:stackoverflow.com/questions/4929243/...
埃里克·罗伯逊

Answers:


124

关于更通用的术语水合物

对对象进行水化处理是获取内存中尚不包含任何域数据(“真实”数据)的对象,然后使用域数据(例如来自数据库,网络或文件)填充该对象系统)。

从埃里克·罗伯逊(Erick Robertson)对这个答案的评论:

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

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

有关水合概念的更多详细信息,请参见埃里克·罗伯森(Erick Robertson)对同一问题的回答

关于名为hydr的Java项目

您是专门问这个框架的,所以我调查了一下。

尽我所能说,我认为这个项目在一般意义上并没有使用“水合”一词。我在标题中看到了它的使用,是“序列化”的近似同义词。如上所述,这种用法并不完全准确:

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

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

我无法在Hydrate FAQ上直接找到它们名称背后的原因,但我了解了它们的意图。我认为他们之所以选择“ Hydrate”(Hydrate)这个名称,是因为该库的用途类似于流行的类似Hibernate框架,但在设计时却考虑了完全相反的工作流程。

包括Hibernate在内的大多数ORM都采用面向内存的面向对象模型的方法,而数据库则是第二考虑的。相反,Hydrate库采用面向数据库模式的方法,可以保留您的关系数据结构,并使您的程序在它们之上更干净地工作。

打个比方来说,还是对于这个库的名字:水合物是像“使一些准备使用”(如重新保湿干燥食品)。这与Hibernate的隐喻相反,它更像是“为冬天丢掉一些东西”(例如Animal Hibernation)。

据我所知,命名库Hydrate的决定与通用计算机编程术语“ hydrate”无关。

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


79
-1水化是指用数据填充现有对象。它不是序列化的同义词。
艾里克·罗伯逊

20
它也不是反序列化的同义词。反序列化涉及使用对象在序列化时拥有的数据来创建对象。水化是指如何用数据填充对象。这是一个细微的差异,但这是一个差异。例如,您不能部分反序列化对象。(至少不通过任何标准API)
Erick Robertson

5
我们都在努力学习。如果我认为它是不必要的,则将其删除,并感谢您的讨论。我的回答不是以Java为中心的,因为我实际上对PHP使用了“水合”一词。对“给物体补水意味着什么”的问题的答案。是“用数据填充现有对象”。必须先存在该对象才能将其水合,反序列化并非如此。 deserialization == instantiation + hydration
埃里克·罗伯逊

2
抱歉,我在为这个答案加上标签时遇到问题,Merlyn Morgan-Graham。保存时将其删除。我也认为膨胀等同于反序列化。我编辑了链接的Wikipedia文章,以删除未发表的声明。对我来说,膨胀意味着某种减压程序。序列化例程与压缩正交。
Erick Robertson 2013年

2
@ErickRobertson边注:@foo回复帖子作者时不需要。
Duncan Jones

230

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

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

您可以说,仅将某些字段(而不是全部字段)加载到对象中时,对象会被部分水化。之所以可以这样做,是因为您当前的操作不需要这些其他字段。因此,没有理由浪费带宽和CPU周期在不使用这些数据时进行加载,传输和设置。

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


7
+1; 在Java和Hydration的上下文中,这是比我更完整的答案。如我的回答所述,它仍然与反序列化通用术语完全同义,但是在ORM中最常用。这是因为ORM API通常可以控制它们检索到的数据集,从而使您可以重用现有的对象映射,而不必为编写的每个查询编写新的映射。可能要提及的是,您在谈论“延迟加载”,因为此问与答都与术语有关:)
Merlyn Morgan-Graham

1
调用从对象获取数据的相反过程-提取是否正确?从对象中提取数据。
Oleg Abrazhaev '16

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}'));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.