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