问题
当有人谈论保湿物体时,这意味着什么?
我在Web上看到一个名为Hydrate的Java项目,它在不同的表示形式(RDMS到OOPS到XML)之间转换数据。这是物体水化的一般含义;在表示之间转换数据?这可能意味着从存储的表示重建对象层次结构吗?
#1 热门回答(159 赞)
水合是指用数据填充对象的过程。尚未被水合的对象已被实例化,并且表示具有数据的实体,但数据尚未加载到对象中。这是出于性能原因而完成的。
此外,在讨论从数据库或其他数据源加载数据的计划时,使用术语水合作用。这里有些例子:
当你只将一些字段加载到其中时,你可以说对象是部分水合的,但不是全部。这可以完成,因为当前操作不需要其他字段。因此,没有理由在不使用时浪费带宽和CPU周期加载,传输和设置这些数据。
此外,还有一些ORM,例如Doctrine,它们在实例化时不会对对象进行水合,但只有在该对象中访问数据时才会对其进行水合。这是一种有助于不加载不会被使用的数据的方法。
#2 热门回答(75 赞)
###关于更通用的术语水合物
保护对象正在获取存在于内存中的对象,该对象尚未包含任何域数据("真实"数据),然后使用域数据(例如来自数据库,来自网络或来自文件)填充它系统)。
来自Erick Robertson对此答案的评论:
反序列化==实例化水合作用
如果你不需要担心性能飙升,并且你没有调试数据访问API内部的性能优化,那么你可能不需要明确地处理水合作用。你通常会使用deserialization,因此你可以编写更少的代码。某些数据访问API不会为你提供此选项,在这些情况下,你还必须自己明确调用水合步骤。
有关水化概念的更多细节,请参阅Erick Robertson's answer同一问题。
###关于名为hydrate的Java项目
你专门询问了这个框架,所以我调查了一下。
据我所知,我不认为这个项目在一般意义上使用了"水合物"这个词。我认为它在标题中的用法是"序列化"的近似同义词。如上所述,这种用法并不完全准确:
请参阅:http://en.wikipedia.org/wiki/Serialization
将数据结构或对象状态转换为可以在相同或另一个计算机环境中存储和重建的格式。
我无法直接在the Hydrate FAQ上找到他们名字背后的原因,但我得到了他们的意图的线索。我认为他们选择了"Hydrate"这个名字,因为该库的目的与流行的声音相似Hibernate framework,但它的设计考虑了完全相反的工作流程。
包括Hibernate在内的大多数ORM都采用面向内存的面向对象模型的方法,数据库是第二个考虑因素。 Hydrate库采用面向数据库模式的方法,保留你的关系数据结构,让你的程序更干净地在它们之上工作。
隐喻地说,仍然关于这个图书馆的名字:Hydrateis就像"制作一些可以随时使用的东西"(如重新保湿Dried Foods)。这是与冬眠相对立的一个隐喻,更像是"为冬天放些东西"(如Animal Hibernation)。
据我所知,决定命名库Hydrate并不关心通用计算机编程术语"水合物"。
当使用通用计算机编程术语"水合物"时,性能优化通常是动机(或调试现有的优化)。即使库支持对对象填充数据的时间和方式进行精细控制,时间和性能似乎也不是名称或库功能的主要动机。该库似乎更关注实现端到端映射和模式保存。
#3 热门回答(33 赞)
虽然Merlyn提到它有点多余的白话,但根据我的经验,它只是指512066715填充/填充对象,而不是实例化/创建它,所以当你需要精确时它是一个有用的词。