การให้ความชุ่มชื้นกับวัตถุหมายความว่าอะไร


204

เมื่อมีคนพูดถึงวัตถุที่ให้ความชุ่มชื่นนั่นหมายความว่าอย่างไร

ฉันเห็นโครงการ Java ชื่อ Hydrate บนเว็บที่แปลงข้อมูลระหว่างการนำเสนอที่แตกต่างกัน (RDMS เป็น OOPS เป็น XML) นี่เป็นความหมายทั่วไปของการให้ความชุ่มชื้นกับวัตถุหรือไม่ การแปลงข้อมูลระหว่างการรับรอง? มันอาจหมายถึงการสร้างลำดับชั้นของวัตถุใหม่จากการเป็นตัวแทนที่เก็บไว้?


3
โปรดดูคำถามนี้ซึ่งมีคำตอบที่ดี มันไม่ใช่คำถามเดียวกันดังนั้นฉันไม่ลงคะแนนให้ปิด แต่มันอธิบายความชุ่มชื้นได้ดี: stackoverflow.com/questions/4929243/…
Erick Robertson

คำตอบ:


124

ด้วยความเคารพต่อไฮเดรตคำทั่วไป

การให้ความชุ่มชื้นวัตถุคือการนำวัตถุที่มีอยู่ในหน่วยความจำที่ยังไม่มีข้อมูลโดเมน ("จริง" ข้อมูล) แล้วเติมด้วยข้อมูลโดเมน (เช่นจากฐานข้อมูลจากเครือข่ายหรือจากไฟล์ ระบบ).

จากความคิดเห็นของ Erick Robertson ในคำตอบนี้:

deserialization == instantiation + hydration

หากคุณไม่จำเป็นต้องกังวลเกี่ยวกับประสิทธิภาพของการพองตัวและคุณไม่ได้ทำการดีบักการปรับปรุงประสิทธิภาพที่อยู่ใน internals ของ data access API คุณอาจไม่จำเป็นต้องจัดการกับความชุ่มชื้นอย่างชัดเจน โดยทั่วไปคุณจะใช้การดีซีเรียลไลเซชันแทนเพื่อให้คุณสามารถเขียนรหัสได้น้อยลง API การเข้าถึงข้อมูลบางตัวไม่ได้ให้ตัวเลือกนี้แก่คุณและในกรณีดังกล่าวคุณจะต้องเรียกขั้นตอนไฮเดรชั่นด้วยตัวเองอย่างชัดเจน

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับแนวคิดของ Hydration ดูคำตอบของ Erick Robertsonในคำถามเดียวกันนี้

ด้วยความเคารพต่อโครงการ Java ที่เรียกว่าไฮเดรต

คุณถามเกี่ยวกับกรอบนี้โดยเฉพาะดังนั้นฉันจึงดูมัน

ดีที่สุดเท่าที่ฉันจะบอกได้ฉันไม่คิดว่าโครงการนี้ใช้คำว่า "ไฮเดรต" ในความหมายทั่วไป ฉันเห็นการใช้งานในชื่อเป็นคำพ้องความหมายโดยประมาณสำหรับ "การทำให้เป็นอนุกรม" ตามที่อธิบายไว้ข้างต้นการใช้งานนี้ไม่ถูกต้องทั้งหมด:

ดู: http://en.wikipedia.org/wiki/Serialization

แปลโครงสร้างข้อมูลหรือสถานะวัตถุเป็นรูปแบบที่สามารถจัดเก็บ [... ] และสร้างใหม่ในภายหลังในสภาพแวดล้อมคอมพิวเตอร์เครื่องเดียวกันหรือเครื่องอื่น

ฉันไม่สามารถหาเหตุผลที่อยู่เบื้องหลังชื่อของพวกเขาได้โดยตรงในคำถามที่พบบ่อยของ Hydrateแต่ฉันได้รับเบาะแสตามความตั้งใจของพวกเขา ฉันคิดว่าพวกเขาเลือกชื่อ "ไฮเดรต" เพราะจุดประสงค์ของห้องสมุดคล้ายกับกรอบไฮเบอร์เนตที่เหมือนเสียงที่ได้รับความนิยมแต่ได้รับการออกแบบโดยคำนึงถึงกระบวนการทำงานที่ตรงกันข้าม

ORMs ส่วนใหญ่รวมถึง Hibernate ใช้แนวทางเชิงวัตถุในหน่วยความจำโดยมีฐานข้อมูลพิจารณาที่สอง ไลบรารี Hydrate จะใช้แนวทางเชิงฐานข้อมูลแทนการรักษาโครงสร้างข้อมูลเชิงสัมพันธ์ของคุณและทำให้โปรแกรมของคุณทำงานได้อย่างสมบูรณ์

ยังคงเกี่ยวกับชื่อของห้องสมุดนี้: ไฮเดรตเป็นเหมือน "การทำให้บางสิ่งบางอย่างพร้อมใช้งาน" (เช่นอาหารแห้งที่ให้ความชุ่มชื้นอีกครั้ง) มันเป็นคำเปรียบเทียบที่ตรงกันข้ามกับHibernateซึ่งเป็นเหมือน "เอาอะไรบางอย่างออกไปสำหรับฤดูหนาว" (เหมือนสัตว์ไฮเบอร์เนต )

การตัดสินใจตั้งชื่อห้องสมุด Hydrate เท่าที่ฉันสามารถบอกได้นั้นไม่เกี่ยวข้องกับคำศัพท์ทั่วไปในการเขียนโปรแกรมคอมพิวเตอร์ "hydrate"

เมื่อใช้คำศัพท์ทั่วไปเกี่ยวกับการเขียนโปรแกรมคอมพิวเตอร์ "ไฮเดรต" การปรับประสิทธิภาพให้เหมาะสมมักเป็นแรงจูงใจ แม้ว่าไลบรารีจะสนับสนุนการควบคุมอย่างละเอียดสำหรับเวลาและวิธีการเติมข้อมูลด้วยวัตถุเวลาและประสิทธิภาพดูเหมือนจะไม่เป็นแรงจูงใจหลักสำหรับชื่อหรือการทำงานของไลบรารี ดูเหมือนว่าห้องสมุดมีความกังวลมากขึ้นในการเปิดใช้งานการทำแผนที่จากต้นทางถึงปลายทางและการสงวนสคีมา


79
-1 ไฮเดรชั่นหมายถึงการเติมข้อมูลวัตถุที่มีอยู่ มันไม่ได้เป็นคำพ้องสำหรับอนุกรม
Erick Robertson

20
มันไม่ได้เป็นคำพ้องสำหรับ deserialization การดีซีเรียลไลซ์เซชันเกี่ยวข้องกับการสร้างออบเจ็กต์ด้วยข้อมูลที่มีอยู่ในขณะนั้นตามลำดับ ไฮเดรชั่นหมายถึงวิธีที่คุณเติมข้อมูลด้วยวัตถุ มันเป็นความแตกต่างเล็กน้อย แต่ก็เป็นความแตกต่าง ยกตัวอย่างเช่นคุณไม่สามารถยกเลิกการซีเรียลไลซ์วัตถุบางส่วนได้ (อย่างน้อยไม่ผ่าน API มาตรฐานใด ๆ )
Erick Robertson

5
เราทุกคนพยายามที่จะเรียนรู้ หากฉันเชื่อว่าไม่จำเป็นฉันจะลบออกและขอขอบคุณที่อภิปราย คำตอบของฉันไม่ใช่ Java-centric เพราะฉันส่วนใหญ่ใช้คำว่า "hydration" เกี่ยวกับ PHP จริงๆแล้ว คำตอบสำหรับคำถาม "การให้ความชุ่มชื่นของวัตถุหมายถึงอะไร" คือ "การเติมข้อมูลวัตถุที่มีอยู่" วัตถุจะต้องมีอยู่ก่อนที่คุณจะสามารถทำให้มันชุ่มชื้นซึ่งไม่เป็นความจริงสำหรับการดีซีเรียลไลเซชัน deserialization == instantiation + hydration
Erick Robertson

2
ขออภัยฉันมีปัญหาในการติดแท็กคุณในคำตอบนี้ Merlyn Morgan-Graham มันจะถูกลบเมื่อฉันบันทึก ฉันยังมีปัญหากับการพองตัวที่ถูกบรรจุให้เป็น ฉันแก้ไขบทความ Wikipedia ที่ลิงก์เพื่อลบการอ้างสิทธิ์ที่ไม่มีแหล่งที่มา การพองตัวของฉันหมายถึงรูทีนการบีบอัดบางอย่าง รูทีนการทำให้เป็นอนุกรมนั้นเป็นฉากตั้งฉากกับการบีบอัด
Erick Robertson

2
@ErickRobertson หมายเหตุด้านข้าง: @fooไม่จำเป็นเมื่อตอบกลับผู้เขียนโพสต์
Duncan Jones

230

ไฮเดรชั่นหมายถึงกระบวนการเติมวัตถุด้วยข้อมูล วัตถุที่ยังไม่ได้ถูกไฮเดรตได้รับการยกตัวอย่างและแสดงถึงเอนทิตีที่มีข้อมูล แต่ยังไม่ได้โหลดข้อมูลลงในวัตถุ นี่คือสิ่งที่ทำเพื่อเหตุผลด้านประสิทธิภาพ

นอกจากนี้ยังใช้คำว่าไฮเดรชั่นเมื่อพูดถึงแผนการสำหรับการโหลดข้อมูลจากฐานข้อมูลหรือแหล่งข้อมูลอื่น ๆ นี่คือตัวอย่างบางส่วน:

คุณสามารถพูดได้ว่าวัตถุนั้นถูกไฮไดรด์บางส่วนเมื่อคุณโหลดบางฟิลด์เท่านั้น แต่ไม่ทั้งหมด สามารถทำได้เนื่องจากฟิลด์อื่น ๆ นั้นไม่จำเป็นสำหรับการดำเนินงานปัจจุบันของคุณ ดังนั้นจึงไม่มีเหตุผลที่จะเสียแบนด์วิดท์และ CPU รอบการโหลดถ่ายโอนและตั้งค่าข้อมูลนี้เมื่อไม่ได้ใช้งาน

นอกจากนี้ยังมีบางส่วนของ ORM เช่น Doctrine ซึ่งไม่ได้ให้ความชุ่มชื้นกับวัตถุเมื่อพวกเขาถูกสร้างอินสแตนซ์ แต่เฉพาะเมื่อเข้าถึงข้อมูลในวัตถุนั้น นี่เป็นวิธีการหนึ่งที่ช่วยในการไม่โหลดข้อมูลที่ไม่ได้ใช้งาน


7
+1; นี่เป็นคำตอบที่สมบูรณ์กว่าของฉันในบริบทของ Java และ Hydration ยังคงมีความหมายเหมือนกันกับคำว่าดีซีเรียลไลเซชั่นโดยทั่วไปตามคำตอบของฉัน แต่ส่วนใหญ่จะใช้ใน ORM นี่เป็นเพราะ ORM APIs มักจะเสนอการควบคุมชุดข้อมูลที่พวกเขาดึงมาช่วยให้คุณสามารถนำการแมปวัตถุที่มีอยู่มาใช้ใหม่แทนที่จะต้องเขียนการแมปใหม่สำหรับแต่ละแบบสอบถามที่คุณเขียน อาจต้องการที่จะพูดถึงว่าคุณกำลังพูดถึง "ขี้เกียจโหลด" ตั้งแต่ Q & A นี่คือทั้งหมดที่เกี่ยวกับคำศัพท์ :)
เมอร์ลิน Morgan-เกรแฮม

1
ถูกต้องหรือไม่ที่จะเรียกกระบวนการตรงกันข้ามในการรับข้อมูลจากการแยกวัตถุ? ดึงข้อมูลจากวัตถุ
Oleg Abrazhaev

43

ขณะที่มันเป็นพื้นถิ่นค่อนข้างซ้ำซ้อนเป็นเมอร์ลินกล่าวถึงในประสบการณ์ของฉันมันหมายเพียงเพื่อบรรจุ / ประชากรของวัตถุไม่ instantiating / สร้างมันจึงเป็นคำที่มีประโยชน์เมื่อคุณจำเป็นต้องมีความแม่นยำ


5
ฉันเปลี่ยนใจและตอนนี้ฉันเห็นด้วยว่าคำตอบนี้แม่นยำกว่าคำตอบเดิม ฉันได้แก้ไขคำตอบของฉันตั้งแต่ (เนื่องจากได้รับการยอมรับและฉันต้องการให้ถูกต้อง) ตอนนี้หวังว่าตอนนี้มันจะสะท้อนให้เห็นถึงความแตกต่างระหว่างการดีซีเรียลไลเซชันและไฮเดรชั่deserialization == instantiation + hydration
Merlyn Morgan-Graham

8

นี่เป็นคำถามที่ค่อนข้างเก่า แต่ดูเหมือนว่ายังมีความสับสนเกี่ยวกับความหมายของคำต่อไปนี้ หวังว่านี่จะทำให้เข้าใจผิด

สารประกอบด้วยน้ำ

เมื่อคุณเห็นคำอธิบายที่พูดถึงสิ่งต่าง ๆ เช่น "วัตถุที่กำลังรอข้อมูลกำลังรอการไฮเดรต" นั่นทำให้เกิดความสับสนและทำให้เข้าใจผิด วัตถุไม่รอสิ่งต่าง ๆ และไฮเดรชั่นก็เป็นเพียงการเติมข้อมูลลงในวัตถุ

ใช้ 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()ในตัวอย่างนี้

เนื่องจากคำว่า "ซีเรียลไลซ์เซชั่น" และ "ดีซีเรียลไลซ์" ถูกกล่าวถึงในคำตอบอื่น ๆ ต่อไปนี้เป็นตัวอย่างที่จะช่วยอธิบายความหมายของแนวคิดเหล่านั้นจากการให้ความชุ่มชื้น:

Serialize

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

deserialize

console.log(JSON.parse('{"foo":true,"bar":true,"baz":true}'));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.