การวิเคราะห์อัลกอริธึมการทำให้เป็นอนุกรมของ Java
การทำให้เป็นอนุกรมเป็นกระบวนการในการอธิบายวัตถุเป็นชุดของไบต์ การดีซีเรียลไลซ์ไลซ์เป็นกระบวนการของการสร้างไบต์เหล่านี้ใหม่ให้เป็นวัตถุ Java Serialization API จัดเตรียมกลไกมาตรฐานสำหรับการจัดการการทำให้เป็นอนุกรมของอ็อบเจ็กต์ ที่นี่คุณสามารถเรียนรู้วิธีการทำให้เป็นอนุกรมของวัตถุ เมื่อจำเป็นต้องมีการทำให้เป็นอนุกรม และอัลกอริธึมการทำให้เป็นอนุกรมของ Java เราใช้ตัวอย่างเพื่อแสดงให้เห็นว่าไบต์หลังจากการทำให้เป็นอนุกรมอธิบายข้อมูลของวัตถุอย่างไร
ความจำเป็นในการทำให้เป็นอนุกรม
ใน Java ทุกอย่างเป็นวัตถุ ในสภาพแวดล้อมแบบกระจาย มักจะจำเป็นต้องถ่ายโอนวัตถุจากเครือข่ายหรืออุปกรณ์หนึ่งไปยังอีกเครือข่ายหนึ่ง ต้องใช้โปรโตคอลที่สามารถส่งข้อมูลได้ทั้งสองด้าน กลไกการทำให้เป็นอนุกรมของ Java ถูกสร้างขึ้นเพื่อแก้ไขปัญหานี้
วิธีการซีเรียลไลซ์วัตถุ
ข้อกำหนดเบื้องต้นสำหรับออบเจ็กต์ที่จะซีเรียลไลซ์ได้คือการใช้อินเทอร์เฟซซีเรียลไลซ์ได้ อินเทอร์เฟซซีเรียลไลซ์ไม่มีวิธีการและเป็นเหมือนเครื่องหมายมากกว่า คลาสที่มีแท็กนี้สามารถประมวลผลได้โดยกลไกการทำให้เป็นอนุกรม
100.
รูปแบบการทำให้เป็นอนุกรมของออบเจ็กต์
วัตถุจะมีลักษณะอย่างไรหลังจากถูกซีเรียลไลซ์? เปิดไฟล์ temp.out ที่เราเพิ่งทำให้เป็นอนุกรมและส่งออกวัตถุ และแสดงเป็นเลขฐานสิบหก เนื้อหาควรเป็นดังนี้:
73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05
63 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 78
70 00 64
เวอร์ชันไบต์สาธารณะ = 100;
จำนวนไบต์สาธารณะ = 0;
ทั้งสองแบบเป็นประเภทไบต์ ตามทฤษฎีแล้ว จำเป็นต้องใช้เพียง 2 ไบต์ในการจัดเก็บทั้งสองฟิลด์นี้ แต่ในความเป็นจริงแล้ว temp.out มีขนาด 51 ไบต์ ซึ่งหมายความว่านอกเหนือจากข้อมูลแล้ว ยังรวมถึงคำอธิบายอื่น ๆ ของอ็อบเจ็กต์ซีเรียลไลซ์ด้วย
อัลกอริธึมการทำให้เป็นอนุกรมของ Java
โดยทั่วไปอัลกอริทึมการทำให้เป็นอนุกรมจะดำเนินการตามขั้นตอนต่อไปนี้:
◆เมตาดาต้าคลาสเอาท์พุทที่เกี่ยวข้องกับอินสแตนซ์ของวัตถุ
◆ส่งออกคำอธิบายซูเปอร์คลาสของคลาสซ้ำๆ จนกว่าจะไม่มีซูเปอร์คลาสอีกต่อไป
◆หลังจากข้อมูลเมตาของคลาสเสร็จสมบูรณ์ ค่าข้อมูลจริงของอินสแตนซ์ออบเจ็กต์จะถูกส่งออกโดยเริ่มจากซูเปอร์คลาสระดับบนสุด
◆ส่งออกข้อมูลอินสแตนซ์ซ้ำจากบนลงล่าง
เรามาอธิบายด้วยอีกตัวอย่างหนึ่งที่ครอบคลุมสถานการณ์ที่เป็นไปได้ทั้งหมดอย่างสมบูรณ์ยิ่งขึ้น:
คลาสประกอบด้วยการดำเนินการแบบอนุกรม {
int มีเวอร์ชั่น = 11;
-
SerialTest ระดับสาธารณะขยายการใช้งานหลัก Serializable {
เวอร์ชัน int = 66;
บรรจุ con = ใหม่บรรจุ ();
สาธารณะ int getVersion () {
เวอร์ชันส่งคืน;
-
โมฆะคงที่สาธารณะ main (String args []) พ่น IOException {
FileOutputStream fos = FileOutputStream ใหม่ ("temp.out");
ObjectOutputStream oos = ObjectOutputStream ใหม่ (fos);
SerialTest st = SerialTest ใหม่ ();
oos.writeObject(st);
oos.ฟลัช();
oos.ปิด();
-
-
รูปแบบซีเรียลไลซ์เป็นดังนี้:
เอซีอีดี 00 05 7372 00 0A 53 65 72 69 61 6C 54 65
73 74 05 52 81 5A เอซี 66 02 F6 02 00 0249 00 07
76 65 72 73 69 6F 6E4C00 03 63 6F 6E74 00 09
4C63 6F 6E 74 61 69 6E 3B 7872 00 06 70 61 72
65 6E 74 0E DB D2 BD 85 EE 63 7A 02 00 0149 00
0D 70 61 72 65 6E 74 56 65 72 73 69 6F 6E 78 70
0000000A 0000004273 72 00 07 63 6F 6E 74
61 69 6EเอฟซีบีบีE6 0E FB CB 60 C7 02 00 0149 00
0E 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E 78
700000000B
มาดูกันดีกว่าว่าไบต์เหล่านี้เป็นตัวแทนอะไร เริ่มแรกดูสี:
ขั้นตอนแรกในอัลกอริธึมการทำให้เป็นอนุกรมคือการส่งออกคำอธิบายของคลาสที่เกี่ยวข้องของออบเจ็กต์ อ็อบเจ็กต์ที่แสดงในตัวอย่างเป็นอินสแตนซ์ของคลาส SerialTest ดังนั้นคำอธิบายของคลาส SerialTest จะถูกส่งออกต่อไป ดูสี:
ถัดไป อัลกอริธึมจะส่งออกฟิลด์ใดฟิลด์หนึ่ง inversion=66; ดูสี:
จากนั้นอัลกอริธึมจะส่งออกโดเมนถัดไป มี con = new contains(); นี่เป็นสิ่งที่พิเศษเล็กน้อย มันคือออบเจ็กต์ เมื่ออธิบายการอ้างอิงประเภทวัตถุ คุณต้องใช้สัญลักษณ์ลายเซ็นวัตถุมาตรฐานของ JVM ดูสี:
จากนั้นอัลกอริธึมจะแสดงคำอธิบายของคลาสซุปเปอร์ซึ่งเป็นคลาสพาเรนต์ ดูสี:
ถัดไป ส่งออกคำอธิบายโดเมนของคลาสพาเรนต์ intparentVersion=100; ดูเพิ่มเติมที่สี:
จนถึงตอนนี้ อัลกอริธึมได้แสดงคำอธิบายของคลาสทั้งหมดแล้ว ขั้นตอนต่อไปคือการส่งออกค่าที่แท้จริงของวัตถุอินสแตนซ์ ในขณะนี้ เริ่มต้นจากโดเมนของคลาสหลัก ดูสี:
นอกจากนี้ยังมีฟิลด์ของคลาส SerialTest:
ไบต์ที่ตามมานั้นน่าสนใจกว่า อัลกอริธึมจำเป็นต้องอธิบายข้อมูลของคลาสบรรจุ โปรดจำไว้ว่า คลาสบรรจุยังไม่ได้อธิบายไว้
. ส่งออกคำอธิบายโดเมนเฉพาะของ contains, intcontainVersion=11;
ในเวลานี้ อัลกอริธึมการทำให้ซีเรียลไลซ์จะตรวจสอบว่ามีคลาสซูเปอร์คลาสหรือไม่ และถ้ามี ก็จะส่งออกเอาต์พุตออกมา
ในที่สุด ค่าโดเมนที่แท้จริงของคลาสบรรจุจะถูกส่งออก
ตกลง เราได้หารือเกี่ยวกับกลไกและหลักการของการทำให้เป็นอนุกรมของ Java แล้ว และเราหวังว่ามันจะเป็นประโยชน์กับนักเรียน