วัตถุประสงค์ของ Serialization ใน Java คืออะไร?


105

ฉันได้อ่านบทความจำนวนมากเกี่ยวกับ Serialization และวิธีการที่ดีและยอดเยี่ยม แต่ไม่มีข้อโต้แย้งใดที่น่าเชื่อเพียงพอ ฉันสงสัยว่าจะมีใครบอกฉันได้จริง ๆ ว่าอะไรคือสิ่งที่เราสามารถบรรลุได้จากการจัดลำดับชั้นเรียน?


10
อะไรที่ "ไม่น่าเชื่อ" เกี่ยวกับข้อโต้แย้งของพวกเขา แล้วทำไมคุณถึงไม่ยอมรับคำตอบสำหรับคำถามของคุณ?
อานนท์.

8
เขา "ไม่มั่นใจ" พวกเขาตอบคำถามของเขา
Anthony Forloney

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

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

1
อย่างใดอย่างหนึ่ง: (ยอมรับคำตอบ) หรือ (โพสต์ความคิดเห็นและ / หรือแก้ไขคำถามเพื่ออธิบายว่าเหตุใดจึงไม่ใช่สิ่งที่คุณต้องการ)
อานนท์.

คำตอบ:


183

มากำหนดอนุกรมกันก่อนจากนั้นเราจะพูดถึงสาเหตุที่มีประโยชน์

Serialization เป็นเพียงการเปลี่ยนวัตถุที่มีอยู่ให้เป็นอาร์เรย์ไบต์ อาร์เรย์ไบต์นี้แสดงถึงคลาสของอ็อบเจ็กต์เวอร์ชันของอ็อบเจ็กต์และสถานะภายในของอ็อบเจ็กต์ จากนั้นอาร์เรย์ไบต์นี้สามารถใช้ระหว่าง JVM ที่ใช้รหัสเดียวกันเพื่อส่ง / อ่านวัตถุ

ทำไมเราถึงต้องการทำเช่นนี้?

มีสาเหตุหลายประการ:

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

  • ความคงอยู่: หากคุณต้องการจัดเก็บสถานะของการดำเนินการเฉพาะในฐานข้อมูลสามารถต่ออนุกรมกับอาร์เรย์ไบต์ได้อย่างง่ายดายและจัดเก็บไว้ในฐานข้อมูลเพื่อเรียกคืนในภายหลัง

  • คัดลอกลึก: หากคุณต้องการที่แน่นอนแบบจำลองของวัตถุและไม่ต้องการที่จะไปที่ปัญหาของการเขียนโคลนเฉพาะ () ระดับของคุณเองเพียง serializing วัตถุที่แถว byte แล้ว de-serializing ไปที่อื่น วัตถุบรรลุเป้าหมายนี้

  • การแคช: เป็นเพียงแอปพลิเคชันข้างต้น แต่บางครั้งวัตถุใช้เวลาสร้าง 10 นาที แต่จะใช้เวลาเพียง 10 วินาทีในการยกเลิกการทำให้เป็นอนุกรม ดังนั้นแทนที่จะยึดวัตถุขนาดใหญ่ไว้ในหน่วยความจำเพียงแค่แคชมันลงในไฟล์ผ่านการทำให้เป็นอนุกรมและอ่านในภายหลังเมื่อจำเป็น

  • การซิงโครไนซ์ข้าม JVM: การทำให้เป็นอนุกรมทำงานกับ JVM ที่แตกต่างกันซึ่งอาจทำงานบนสถาปัตยกรรมที่แตกต่างกัน


63
อะไรบนโลกนี้ใช้เวลา 10 นาทีในการสร้าง?
oxbow_lakes

2
ประเด็นของฉัน (แน่นอน) ว่าไฟล์ I / O ที่เกี่ยวข้องกับการทำให้เป็นอนุกรมน่าจะทำให้ค่าใช้จ่ายในการสร้างวัตถุบริสุทธิ์ลดลง ฉันคิดว่าคุณอาจกำลังพูดถึงบางสิ่งที่มีราคาแพงมากในเชิงคำนวณเช่นการสร้างแบบจำลองทางวิทยาศาสตร์ แต่การทำให้เป็นอนุกรมเป็นกลไกที่แย่มากสำหรับการคงอยู่เนื่องจากการจัดการกับการเปลี่ยนแปลงสคีมาทำได้ยาก
oxbow_lakes

11
@oxbow_lakes ตัวอย่างอาจเป็นไปได้หากคุณรักษาดัชนีของชุดข้อมูลเฉพาะสำหรับการค้นหาอย่างรวดเร็ว ดัชนีแบบนี้อาจใช้เวลานานมากในการสร้าง แต่เมื่อคุณสร้างแล้วจะสามารถต่ออนุกรม / ยกเลิกการต่ออนุกรมได้ค่อนข้างเร็ว
เดวิด

หากคำขอเว็บแอปต้องส่งผ่านเราเตอร์ทุกตัวในโลกก่อนที่จะไปถึงปลายทางให้สร้างวัตถุกลับมาพร้อมกับวัตถุโดยใช้เส้นทางที่ยาวที่สุดเท่าที่จะเป็นไปได้อาจใช้เวลา 10 นาที
Vaibs

@Schmelter เนื่องจากคุณพูดถึง Serialization ไม่ใช่วิธีการสื่อสารที่ดีที่สุดวิธีใดเป็นวิธีที่เหมาะสมและดีที่สุดในการดำเนินการ
Ashfaque Rifaye

58

ในขณะที่คุณเรียกใช้แอปพลิเคชันของคุณวัตถุทั้งหมดจะถูกเก็บไว้ในหน่วยความจำ (RAM) เมื่อคุณออกหน่วยความจำนั้นจะถูกเรียกคืนโดยระบบปฏิบัติการและโปรแกรมของคุณจะ 'ลืม' ทุกสิ่งที่เกิดขึ้นในขณะที่กำลังทำงานอยู่ การทำให้เป็นอนุกรมจะแก้ไขได้โดยให้แอปพลิเคชันของคุณบันทึกวัตถุลงในดิสก์เพื่อให้สามารถอ่านย้อนหลังได้ในครั้งต่อไปที่เริ่มต้น หากแอปพลิเคชันของคุณกำลังจะจัดเตรียมวิธีการบันทึก / แบ่งปันสถานะก่อนหน้านี้คุณจะต้องมีการจัดลำดับรูปแบบบางรูปแบบ


2
ดูเหมือนว่ามันจะเป็นวิธีที่ดีกว่าและมีประสิทธิภาพมากขึ้นในการเขียนข้อมูลลงในไฟล์และอ่านกลับเมื่อจำเป็น?
m_a_khan

1
นี่เป็นคำอธิบายที่แท้จริงเท่านั้น ฉันไม่สามารถนึกถึงการประยุกต์ใช้อนุกรม +1 ในโลกแห่งความเป็นจริงอื่นใด
Emily

สั้นและหวาน คำอธิบายที่สมบูรณ์แบบ
Yakhoob

21

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

ฉันมีหลายโปรเจ็กต์ที่ต้องโหลดและอ่านไฟล์ข้อความจำนวนมาก ไฟล์มีคำหยุดคำกริยาทางชีวการแพทย์คำย่อทางชีวการแพทย์คำที่เชื่อมโยงกันทางความหมาย ฯลฯ เนื้อหาของไฟล์เหล่านี้ง่ายมาก: คำ !

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

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


1
ในกรณีเช่นนี้ทำไมคุณต้องเก็บไว้ในไบต์อาร์เรย์สตรีม (โดยใช้ซีเรียลไลซ์) มันง่ายกว่าการใช้ฟิลด์ชั่วคราวหรือไม่?
kidnan1991

3

ในสาระสำคัญ :

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

ดูการใช้งานจากWiki :

การทำให้เป็นอนุกรมมีข้อดีหลายประการ ให้:

  1. วิธีการคงอยู่ของอ็อบเจ็กต์ซึ่งสะดวกกว่าการเขียนคุณสมบัติลงในไฟล์ข้อความบนดิสก์และนำมาประกอบใหม่โดยอ่านสิ่งนี้กลับเข้ามา
  2. วิธีการออกการเรียกโพรซีเดอร์ระยะไกลเช่นใน SOAP
  3. วิธีการกระจายวัตถุโดยเฉพาะอย่างยิ่งในส่วนประกอบของซอฟต์แวร์เช่น COM, CORBA เป็นต้น
  4. วิธีการตรวจจับการเปลี่ยนแปลงของข้อมูลที่แปรตามเวลา

1

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

นอกจากนี้โปรดทราบว่าการทำให้เป็นอนุกรมเป็นแบบวนซ้ำดังนั้นคุณสามารถจัดลำดับโครงสร้างข้อมูลที่แตกต่างกันทั้งหมดให้เป็นอนุกรมได้หากต้องการ


0

อ็อบเจ็กต์ที่ต่อเนื่องจะรักษาสถานะในอวกาศสามารถถ่ายโอนผ่านเครือข่ายระบบไฟล์ ฯลฯ ... และเวลาพวกมันสามารถอยู่ได้นานกว่า JVM ที่สร้างขึ้น

บางครั้งสิ่งนี้ก็มีประโยชน์


ซึ่งสามารถทำได้ด้วยไฟล์ธรรมดาที่มีข้อความบางส่วนด้วย มันง่ายกว่าเล็กน้อยในการอ่านกลับวัตถุที่ทำให้เป็นอนุกรมจากนั้นอ่านสถานะของวัตถุที่เขียนลงในไฟล์ข้อความถูกต้องหรือไม่?
m_a_khan

@m_a_khan: ว้าว. ใช่สามารถทำได้ด้วยข้อความง่ายๆ แต่ทันทีที่ Objects มีความซับซ้อนมากขึ้นหรือโครงสร้างที่ดีขึ้น (การประกอบการสืบทอด) จะซับซ้อนมากขึ้นมันจะกลายเป็นเรื่องยุ่งยากในการ (ยกเลิก) การจัดเรียงด้วยตนเอง ลองนึกภาพว่ามีรายการชุดและแผนที่เป็นสมาชิกวัตถุ
Dirk Schumacher

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

0

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


1
ในความคิดของฉันการค้นหาข้อมูลและการใช้ออบเจ็กต์การกำหนดค่าเดียวเป็นพารามิเตอร์นั้นค่อนข้างตั้งฉากกัน อาจไม่ใช่กรณีการใช้งานทั่วไป
Gábor Bakos

0

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

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

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


ในขณะที่พยายามใส่สิ่งต่างๆเป็นภาษาอังกฤษธรรมดาคุณยังไม่ได้อธิบายการทำให้เป็นอนุกรมในทางที่เป็นประโยชน์
user3516726
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.