Cosa significa idratare un oggetto?


205

Quando qualcuno parla dell'idratazione di un oggetto, cosa significa?

Vedo un progetto Java chiamato Hydrate sul web che trasforma i dati tra diverse rappresentazioni (da RDMS a OOPS in XML). È questo il significato generale dell'idratazione degli oggetti? trasformare i dati tra rappresentazioni? Potrebbe significare ricostruire una gerarchia di oggetti da una rappresentazione memorizzata?


3
Vedi anche questa domanda, che ha un'ottima risposta. Non è esattamente la stessa domanda, quindi non voterò per chiudere. Ma spiega bene l'idratazione: stackoverflow.com/questions/4929243/…
Erick Robertson,

Risposte:


124

Rispetto al termine più generico idrato

L'idratazione di un oggetto sta prendendo un oggetto esistente in memoria, che non contiene ancora alcun dato di dominio (dati "reali") e quindi lo popola con dati di dominio (come da un database, dalla rete o da un file sistema).

Dai commenti di Erick Robertson su questa risposta:

deserializzazione == istanziazione + idratazione

Se non devi preoccuparti delle prestazioni minime e non stai eseguendo il debug delle ottimizzazioni delle prestazioni che si trovano all'interno di un'API di accesso ai dati, probabilmente non dovrai occuparti dell'idratazione in modo esplicito. In genere si utilizza invece la deserializzazione in modo da poter scrivere meno codice. Alcune API di accesso ai dati non offrono questa opzione e in quei casi dovresti anche chiamare esplicitamente il passaggio di idratazione da solo.

Per un po 'più di dettaglio sul concetto di idratazione, vedi la risposta di Erick Robertson su questa stessa domanda.

Rispetto al progetto Java chiamato idrato

Hai chiesto informazioni su questo framework in modo specifico, quindi ho esaminato.

Per quanto posso dire, non penso che questo progetto abbia usato la parola "idratare" in un senso molto generico. Vedo il suo uso nel titolo come sinonimo approssimativo di "serializzazione". Come spiegato sopra, questo utilizzo non è del tutto accurato:

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

traduzione delle strutture dati o dello stato dell'oggetto in un formato che può essere [...] memorizzato e ricostruito successivamente nello stesso o in un altro ambiente informatico.

Non riesco a trovare il motivo dietro il loro nome direttamente nelle FAQ di Hydrate , ma ho avuto indizi sulla loro intenzione. Penso che abbiano scelto il nome "Hydrate" perché lo scopo della libreria è simile al popolare framework Hibernate simile al suono , ma è stato progettato pensando esattamente al flusso di lavoro opposto.

La maggior parte degli ORM, incluso Hibernate, adottano un approccio orientato al modello di oggetti in memoria, tenendo conto del database. La libreria Hydrate utilizza invece un approccio orientato allo schema del database, preservando le strutture dei dati relazionali e consentendo al programma di funzionare su di esse in modo più pulito.

Metaforicamente parlando, sempre rispetto al nome di questa biblioteca: Hydrate è come "preparare qualcosa pronto all'uso" (come reidratare Dried Foods ). È un opposto metaforico di Hibernate , che è più come "mettere via qualcosa per l'inverno" (come il letargo animale ).

La decisione di nominare la libreria Hydrate, per quanto ne so, non riguardava il termine generico di programmazione del computer "idrato".

Quando si utilizza il termine generico di programmazione del computer "idrata", le ottimizzazioni delle prestazioni sono in genere la motivazione (o il debug delle ottimizzazioni esistenti). Anche se la libreria supporta un controllo granulare su quando e come gli oggetti sono popolati di dati, i tempi e le prestazioni non sembrano essere la motivazione principale per il nome o la funzionalità della libreria. La libreria sembra più preoccupata di abilitare la mappatura end-to-end e la conservazione dello schema.


79
-1 L'idratazione si riferisce al riempimento di un oggetto esistente con dati. Non è sinonimo di serializzazione.
Erick Robertson,

20
Non è neppure sinonimo di deserializzazione. La deserializzazione implica la creazione dell'oggetto con i dati che aveva al momento della serializzazione. L'idratazione si riferisce a come si riempie un oggetto di dati. È una differenza sottile, ma è una differenza. Ad esempio, non è possibile deserializzare parzialmente un oggetto. (almeno, non tramite alcuna API standard)
Erick Robertson il

5
Stiamo tutti cercando di imparare. Se ritengo che non sia necessario, lo rimuoverò e apprezzo la discussione. La mia risposta non è incentrata su Java, in quanto ho usato principalmente il termine "idratazione" per quanto riguarda PHP. La risposta alla domanda "Cosa significa idratare un oggetto?" sta "riempiendo un oggetto esistente di dati". L'oggetto deve esistere prima che tu possa idratarlo, il che non è vero per la deserializzazione. deserialization == instantiation + hydration
Erick Robertson,

2
Scusa, ho problemi a taggarti in questa risposta, Merlyn Morgan-Graham. Viene rimosso quando lo salvo. Metto anche in discussione il fatto che gonfiare sia equiparato alla deserializzazione. Ho modificato l'articolo di Wikipedia collegato per rimuovere il reclamo non assegnato. Gonfiare per me implica una sorta di routine di decompressione. Una routine di serializzazione è ortogonale alla compressione.
Erick Robertson,

2
@ErickRobertson Nota a margine: @foonon è necessario quando si risponde all'autore del post.
Duncan Jones,

230

L'idratazione si riferisce al processo di riempimento di un oggetto con dati. Un oggetto che non è stato ancora idratato è stato istanziato e rappresenta un'entità che ha dati, ma i dati non sono stati ancora caricati nell'oggetto. Questo è qualcosa che viene fatto per motivi di prestazioni.

Inoltre, il termine idratazione viene utilizzato quando si discute di piani per il caricamento di dati da database o altre fonti di dati. Ecco alcuni esempi:

Si potrebbe dire che un oggetto è parzialmente idratato quando si sono caricati solo alcuni dei campi, ma non tutti. Questo può essere fatto perché quegli altri campi non sono necessari per le tue operazioni correnti. Quindi non c'è motivo di sprecare la larghezza di banda e i cicli della CPU caricando, trasferendo e impostando questi dati quando non verranno utilizzati.

Inoltre, ci sono alcuni ORM, come Doctrine, che non idratano gli oggetti quando vengono istanziati, ma solo quando si accede ai dati in quell'oggetto. Questo è un metodo che aiuta a non caricare i dati che non verranno utilizzati.


7
+1; Questa è una risposta più completa della mia, nel contesto di Java e Hydration. È ancora completamente sinonimo del termine generale deserializzazione, come affermato dalla mia risposta, ma è più comunemente usato negli ORM. Questo perché le API ORM spesso offrono il controllo sul set di dati che recuperano, consentendo di riutilizzare una mappatura di oggetti esistente invece di dover scrivere nuove mappature per ogni query scritta. Potrei menzionare che stai parlando di "caricamento lento", dal momento che queste domande e risposte riguardano la terminologia :)
Merlyn Morgan-Graham,

1
È corretto chiamare un processo opposto per ottenere dati dall'estrazione di oggetti? Estrai i dati dall'oggetto.
Oleg Abrazhaev,

43

Mentre è in qualche modo ridondante vernacolare come menzionato Merlyn, nella mia esperienza si riferisce solo al riempimento / popolamento di un oggetto, non all'istanza / creazione di esso, quindi è una parola utile quando è necessario essere precisi.


5
Ho cambiato idea e ora sono d'accordo sul fatto che questa risposta è più accurata della mia vecchia risposta. Da allora ho modificato la mia risposta (da quando è stata accettata e voglio che sia accurata). Ora spero che rifletta ora la differenza tra deserializzazione e idratazione (in particolare deserialization == instantiation + hydration).
Merlyn Morgan-Graham,

8

Questa è una domanda piuttosto vecchia, ma sembra che ci sia ancora confusione sul significato dei seguenti termini. Spero che questo non chiarisca.

Idrato

Quando vedi descrizioni che dicono cose come "un oggetto in attesa di dati, è in attesa di essere idratato", è confuso e fuorviante. Gli oggetti non aspettano le cose e l'idratazione è solo l'atto di riempire un oggetto di dati.

Utilizzando JavaScript come esempio:

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

Tutto ciò che aggiunge valori objè "idratandolo". Sto solo usando Object.assign()in questo esempio.

Poiché i termini "serializzare" e "deserializzare" sono stati menzionati anche in altre risposte, ecco alcuni esempi che aiutano a chiarire il significato di questi concetti dall'idratazione:

Serialize

console.log(JSON.stringify({ foo: true, bar: true, baz: true }));

Deserialize

console.log(JSON.parse('{"foo":true,"bar":true,"baz":true}'));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.