给物体补水是什么意思?

2022-08-31 05:12:49

当有人谈论给物体补水时,这意味着什么?

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


答案 1

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

此外,在讨论从数据库或其他数据源加载数据的计划时,将使用术语“水合”。以下是一些示例:

你可以说,当你只将一些字段加载到一个对象中时,它就部分水合了,但不是全部。之所以可以这样做,是因为这些其他字段对于您当前的操作不是必需的。因此,没有理由浪费带宽和CPU周期来加载,传输和设置此数据,而无需使用它。

此外,还有一些ORM,例如 Doctrine,它们在实例化对象时不会冻结对象,而仅在该对象中访问数据时。这是一种有助于不加载不会使用的数据的方法。


答案 2

关于更通用的术语水合物

冻结对象是获取内存中存在的对象,该对象尚未包含任何域数据(“真实”数据),然后使用域数据(例如来自数据库、网络或文件系统)填充该对象。

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

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

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

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

关于 Java 项目,称为 hydrate

你专门问了这个框架,所以我研究了它。

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

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

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

我无法直接在Hydrate FAQ上找到他们名字背后的原因,但我得到了他们意图的线索。我认为他们之所以选择“Hydrate”这个名字,是因为该库的目的类似于流行的类似声音的Hibernate框架,但它的设计考虑了完全相反的工作流程。

大多数 ORM(包括 Hibernate)都采用内存中面向对象模型的方法,其次是数据库。相反,Hydrate 库采用面向数据库模式的方法,保留关系数据结构,并让您的程序更干净地在其上工作。

打个比方,关于这个图书馆的名字:水合物就像“制作一些现成的东西”(比如重新补水干食)。这是Hibernate的隐喻对立面,Hibernate更像是“为冬天收拾东西”(如Animal Hibernation)。

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

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