การทำให้เป็นอันดับ Java - ข้อดีและข้อเสียใช้หรือหลีกเลี่ยง? [ปิด]


20

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

คำถามนี้มาถึงใจหลังจากเห็นบทความ DZone Is Object Serialization Evil หรือไม่?

และนี่คือบรรทัดที่ก่อให้เกิดคำถามของฉัน:

หากคุณดูที่ Java และวัตถุเซสชันจะมีการใช้การทำให้เป็นอันดับวัตถุอย่างแท้จริง สมมติว่าเซสชันแอปพลิเคชันค่อนข้างสั้นซึ่งมีความหมายมากที่สุดในเวลาไม่กี่ชั่วโมงการทำให้เป็นอันดับวัตถุนั้นง่าย ๆ ได้รับการสนับสนุนอย่างดีและสร้างขึ้นในแนวคิด Java ของเซสชัน อย่างไรก็ตามเมื่อการคงอยู่ของข้อมูลเป็นระยะเวลานานอาจเป็นวันหรือหลายสัปดาห์และคุณต้องกังวลเกี่ยวกับแอพพลิเคชั่นใหม่ ๆ ตามที่นักพัฒนา Java ที่ดีทุกคนรู้ถ้าคุณวางแผนที่จะทำให้เป็นอันดับวัตถุแม้ในเซสชั่นคุณต้องมีซีเรียลไลซ์เซชั่น ID จริง ๆ (serialVersionUID) ไม่ใช่แค่ 1L และคุณต้องใช้อินเตอร์เฟส Serializable อย่างไรก็ตามผู้พัฒนาส่วนใหญ่ไม่ทราบกฎที่แท้จริงที่อยู่เบื้องหลังกระบวนการดีซีเรียลไลเซชั่น Java หากวัตถุของคุณมีการเปลี่ยนแปลงมากกว่าแค่การเพิ่มเขตข้อมูลอย่างง่ายไปยังวัตถุ เป็นไปได้ว่า Java ไม่สามารถทำการ deserialize วัตถุได้อย่างถูกต้องแม้ว่า ID ซีเรียลไลซ์เซชั่นจะไม่เปลี่ยนแปลง ทันใดนั้นคุณไม่สามารถเรียกคืนข้อมูลของคุณได้อีกต่อไปซึ่งไม่ดีอย่างแท้จริง

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


คุณคิดจะขยายอะไรเล็กน้อยในบทความที่อ้างถึงทำให้เกิดคำถาม
ริ้น

@gnat - เพิ่มบรรทัดให้กับคำถาม
เครื่องขูดบนท้องฟ้า

ส่วนเกี่ยวกับ 'ไม่ใช่แค่เพียง1L' ไม่ถูกต้อง
user207421

คำตอบ:


15

การทำให้เป็นอนุกรมส่วนใหญ่จะใช้ในสองด้าน:

  • การสร้างต้นแบบของการคงอยู่

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

  • การจัดเก็บข้อมูลระยะสั้นของวัตถุเกือบจะ:

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

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

JAXB และเทคโนโลยีที่คล้ายคลึงกันให้ฟังก์ชั่นที่คล้ายกันซึ่งมีต้นทุนต่ำในทำนองเดียวกันในขณะที่ลดปัญหาบางอย่าง


ฉันจะไม่เรียก JAXB ว่า 'ราคาถูก' - ต้องเขียนสคีมา
kevin cline

3
@kevincline: คุณไม่จำเป็นต้องมี schema กับ JAXB มันเป็นตัวเลือกทั้งหมด (และคุณสามารถสร้างมันขึ้นมาจากคลาสของคุณได้ถ้าคุณต้องการ) นอกจากนี้: หาก JAXB ไม่มีประโยชน์ไม่ว่าด้วยเหตุผลใดก็ตามมีทางเลือกมากมายเช่น XML Beans ใช้งานได้ดี
โจอาคิมซาวเออ

12

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

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


3
นั่นเป็นกรณีการใช้งานที่น่าสนใจ! เล็กเกินกว่าจะเรียกใช้ระบบ "ซับซ้อนมากขึ้น" และข้อเสียส่วนใหญ่ใช้ไม่ได้!
โจอาคิมซาวเออ

ตอนนี้เราได้เขียนตัววิเคราะห์ post-mortem ที่ใช้ POI เพื่อสร้างสเปรดชีตจากวัตถุ Java เพื่อให้ดูง่ายขึ้น สิ่งนี้ช่วยให้เราสามารถตรวจสอบไฟล์บันทึกได้หลายชั่วโมง
วินไคลน์

7

อะไรคือข้อดีของการทำให้เป็นอนุกรมมากกว่าวิธีที่ไม่เป็นอนุกรม

การทำให้เป็นอันดับของ Java มีข้อดีบางประการ:

  • ติดตั้งในระบบ : คุณไม่จำเป็นต้องพึ่งพาเครื่องมือไลบรารีหรือการกำหนดค่าของบุคคลที่สาม

  • ค่อนข้างง่ายที่จะเข้าใจอย่างน้อยก็ในตอนแรก

  • นักพัฒนาทุกคนรู้ (หรือควร) ไม่ว่า Java devs จะอนุมัติหรือไม่อนุมัติพวกมันก็มีแนวโน้มที่จะคุ้นเคยกับวัตถุ Java ที่ทำให้เป็นอนุกรม

และแน่นอนมีข้อเสียคือ

  • หลีกเลี่ยงการไหลของ Java มาตรฐาน จัดสรรหน่วยความจำ แต่ไม่เรียกใช้ตัวสร้างดังนั้นเขตข้อมูลชั่วคราวจะไม่ถูกเตรียมใช้งาน ฟิลด์จะเริ่มต้นตามลำดับตัวอักษรไม่ใช่แหล่งที่มา

  • ไม่ค่อยมีประสิทธิภาพในแง่ของพื้นที่ แต่ก็ไม่น่ากลัวเหมือนกัน คุณอาจต้องการบีบอัดผลลัพธ์

  • เปราะเว้นแต่คุณจะระมัดระวังเมื่อวัตถุของคุณเปลี่ยน และยิ่งกว่านั้น

ควรใช้เมื่อใดและควรหลีกเลี่ยงเมื่อใด

ใช้เมื่อ :

  • เรื่องขนาดการปรับใช้ สร้างขึ้นในระบบดังนั้น 0 ไบต์พิเศษ

  • นักแสดงทุกคนจะใช้เวอร์ชั่นที่เข้ากันได้

  • การจัดเก็บข้อมูลระยะยาวไม่ใช่ปัญหา

หลีกเลี่ยงเมื่อ :

  • ข้อใดข้อหนึ่งข้างต้นใช้ไม่ได้

3

การทำให้เป็นอันดับและ ORM / ฐานข้อมูลเป็นสิ่งที่แตกต่างกันแม้ว่าจะมีบางอย่างที่ทับซ้อนกัน

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

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

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


0

การใช้ซีเรียลไลซ์เซชั่นนั้นไม่ค่อยได้ใช้ในทางปฏิบัติ

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

สำหรับข้อมูลที่ต้องเก็บรักษาไว้เป็นเวลานาน (เช่นตะกร้าสินค้าของ Amazon) วิธีที่ดีที่สุดคือการเก็บข้อมูลนั้นไว้ในฐานข้อมูล

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

มีสองปัญหาเกี่ยวกับวิธีการนี้:

ก่อนอื่นให้ล้างข้อมูลเซสชันไปยังฐานข้อมูลเซสชันเป็นกระบวนการที่ช้า การล้างข้อมูลเซสชันบ่อยเกินไปจะทำให้ประสิทธิภาพลดลงและเซิร์ฟเวอร์ส่วนใหญ่ได้รับการกำหนดค่าให้ล้างข้อมูลทุก ๆ 30 วินาทีหรือทุกนาทีหรือนานกว่านั้น วิธีแก้ไขปัญหา "ล้มเหลว" นี้ไม่มีผล 100%

ประการที่สองประสบการณ์ของฉันคือลูกค้าส่วนใหญ่ยอมรับว่าการส่งข้อความแสดงข้อผิดพลาดเพื่อขอให้ผู้ใช้เข้าสู่ระบบและลองอีกครั้งในช่วงเวลาที่หายากที่เซิร์ฟเวอร์ล้มเหลว ในกรณีนี้เราปิดฐานข้อมูลเซสชันทั้งหมดและเพลิดเพลินกับการเพิ่มประสิทธิภาพ

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

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

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


2
"การใช้ซีเรียลไลซ์เซชั่นนั้นไม่ค่อยได้ใช้ในทางปฏิบัติ" - การทำให้เป็นอันดับมักจะถูกเรียกในโลกของบริการเว็บ REST ส่วนใหญ่เวลาหนึ่งกำลังจัดการกับ Strings and Integers หรือสิ่งที่คล้ายกัน - แต่มันเป็นของจริงและวัตถุที่ซับซ้อนกว่านั้นจำเป็นต้องมีการรับรู้ ในการบอกว่ามันถูกใช้งานบ่อยครั้งจะไม่สนใจโดเมนจำนวนมากที่ใช้งานบ่อย

0

คำตอบสั้น ๆ "เมื่อต้องใช้การทำให้เป็นอันดับ Java" และ "เมื่อใดเพื่อหลีกเลี่ยงการทำให้เป็นอันดับ Java"

ใช้การทำให้เป็นอันดับ Java ถ้า

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

ในสถานการณ์อื่น ๆ ทั้งหมด "การทำให้เป็นอันดับไบนารีของ Java" ไม่ดี

ทางเลือก

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