【问题标题】:What does it mean to hydrate an object?给物体补水是什么意思?
【发布时间】:2011-10-22 21:33:16
【问题描述】:

当有人谈到为物体补水时,这是什么意思?

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

【问题讨论】:

标签: java oop


【解决方案1】:

在 PHP 中,您可以根据其名称创建一个新类,而无需调用构造函数,如下所示:

require "A.php";
$className = "A";
$class = new \ReflectionClass($className);
$instance = $class->newInstanceWithoutConstructor();

然后,您可以水合调用 setter(或公共属性)

【讨论】:

    【解决方案2】:

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

    补水

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

    以 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}'));
    

    【讨论】:

    • 现实生活中的例子。
    【解决方案3】:

    关于更通用的术语水合物

    对一个对象进行水合是获取一个存在于内存中的对象,该对象尚不包含任何域数据(“真实”数据),然后用域数据(例如来自数据库、来自网络或来自文件系统)。

    来自 Erick Robertson 对此答案的 cmets:

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

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

    有关 Hydration 概念的更多详细信息,请参阅Erick Robertson's answer 就同一问题。

    关于the Java project called hydrate

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

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

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

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

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

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

    打个比方,还是就这个库的名称而言:Hydrate 就像“使某些东西准备好使用”(例如重新水合Dried Foods)。它是 Hibernate 的隐喻对立面,更像是“为冬天收拾东西”(如Animal Hibernation)。

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

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

    【讨论】:

    • -1 水化是指用数据填充现有对象。它不是序列化的同义词。
    • 它也不是反序列化的同义词。反序列化涉及使用序列化时的数据创建对象。水合是指如何用数据填充对象。这是一个微妙的差异,但它是一个差异。例如,您不能部分反序列化对象。 (至少,不通过任何标准 API)
    • 我们都在努力学习。如果我认为它是不必要的,我会删除它,我很感激讨论。我的回答不是以 Java 为中心的,因为实际上我在 PHP 方面大多使用了“水合”一词。对“给物体补水是什么意思?”这个问题的答案是“用数据填充现有对象”。该对象必须先存在,然后才能对其进行水合,这对于反序列化是不正确的。 deserialization == instantiation + hydration
    • 抱歉,Merlyn Morgan-Graham 在此答案中标记您时遇到问题。当我保存它时它会被删除。我也反对将膨胀等同于反序列化。我编辑了链接的 Wikipedia 文章以删除无来源声明。对我来说,充气意味着某种减压程序。序列化例程与压缩正交。
    • @ErickRobertson 旁注:回复帖子作者时不需要@foo
    【解决方案4】:

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

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

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

    此外,还有一些 ORM,例如 Doctrine,在实例化对象时不会水合对象,而只会在对象中访问数据时才水合。这是一种有助于不加载不会使用的数据的方法。

    【讨论】:

    • +1;在 Java 和 Hydration 的上下文中,这是一个比我更完整的答案。正如我的回答所说,它仍然与通用术语反序列化完全同义,但最常用于 ORM。这是因为 ORM API 通常提供对它们检索的数据集的控制,允许您重用现有的对象映射,而不必为您编写的每个查询编写新的映射。可能要提一下您在谈论“延迟加载”,因为此问答都是关于术语的:)
    • 调用从对象获取数据的相反过程是否正确 - 提取?从对象中提取数据。
    【解决方案5】:

    虽然正如 Merlyn 提到的那样,它有点多余的白话,但根据我的经验,它指的是填充/填充对象,而不是实例化/创建它,所以当你需要时它是一个有用的词精确。

    【讨论】:

    • 我改变了主意,现在我同意这个答案比我的旧答案更准确。我已经编辑了我的答案(因为它被接受了,我希望它是准确的)。现在希望它现在反映了反序列化和水合之间的区别(特别是deserialization == instantiation + hydration)。
    猜你喜欢
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2016-08-21
    • 2011-10-02
    • 2016-03-28
    • 1970-01-01
    相关资源
    最近更新 更多